内容简介:不论是在工作还是学习中,相信大家都会被this指针问题锁困扰,此篇文章就是帮助大家解决this指向问题,希望可以帮大家对this指针有着更深入的了解在项目中,我们不可避免的会使用定时器,定时器也成为大家项目中的家常便客,但是在项目中大家会经常因为定时器this指针问题困扰,特别实在单页面应用中,定时器不关掉会严重消耗资源,下面来给大家介绍下this指针问题和解决方案好了,这样一个简单的demo就搭建完成了,下面来给大家讲解一下为什么这么写
不论是在工作还是学习中,相信大家都会被this指针问题锁困扰,此篇文章就是帮助大家解决this指向问题,希望可以帮大家对this指针有着更深入的了解
1, 定时器中的this指针问题
在项目中,我们不可避免的会使用定时器,定时器也成为大家项目中的家常便客,但是在项目中大家会经常因为定时器this指针问题困扰,特别实在单页面应用中,定时器不关掉会严重消耗资源,下面来给大家介绍下this指针问题和解决方案
// 例如:在vue项目中使用定时器 export default { name:"component", data(){ return{ time:null, //定义一个定时器初始值 } }, mounted(){ // 这个定义变量尽量使用_this,或者self,方便其他同时识别 let _this = this; // 进入页面开始轮询查询接口,这里仅仅演示使用fetch查询,axios同理 this.time = setInterval(function(){ fetch('url',{ methods:'get', }) .then(res => res.json().then(data => console.log(data))) },3000) }, destoryed(){ // 个人习惯,喜欢定义一个局部变量,避免this指针自己不好控制 let _this = this; clearInterval(_this.time) } }复制代码
好了,这样一个简单的demo就搭建完成了,下面来给大家讲解一下为什么这么写
由于个人习惯原因,本人喜欢先定义一个局部变量,避免使用全局变量,既 let _this = this
;
首先我们来看下如果不使用 let _this = this
的效果吧
可以看到,如果不保存全局变量直接使用 this
, this
会指向 window
,不会指向实例vue,而在 window
上找不到 time
属性,所以无法清楚定时器。
再来实验一下定一个一个局部变量 _this
来保存全局变量吧
可以看到。定义了局部变量 _this
保存全局变量 this
会使 _this
指向 vue
实例
这样就解决了定时器在单页面项目中无法清除定时器的问题了。
2, 引用值的this指向问题(既堆内存中this的指向)
不管使初学者还是学了很久js的伙伴,大家逗知道调用谁, this
就指向谁,这句话没错,但是要联系上下文,不只是简单的调用谁就指向谁,下面来看一个:chestnut:
var a = 2; var obj = { a:1, b:function() { console.log(this.a) } } console.log(obj.b()); var fn = obj.b; console.log(fn());复制代码
下面来看下这道题的具体思路吧
var a = 2; var obj = { a:1, b:function() { console.log(this.a) // 在对象内部调用this,this指向obj } } console.log(obj.b()); // 此时this指针指向的是obj,打印结果为:1 var fn = obj.b; // var 一个变量,此时this指向fn,fn在window上,所以指向window console.log(fn()); // 此时打印的全局变量window上的a, 既打印结果为:2复制代码
对于下面的 this
指向 window
相信大家可能还有一定的误解,在这里我说一下本人对引用值中 this
的理解
1.谁调用 this
就指向谁
2. var
或者 new
出来的实例逗创建了一个新的实例,全局变量是挂载在 window
上的,所以 this
指向的是 window。
3.原始值中this 的指向(既栈内存中this 的指向)
// 栈内存this的指向相对好理解 var a = 1; //申明全局变量a,全局变量挂载在window上 var b = 2; //申明全局变量b,全局变量b挂载在window上 console.log(this.a) ; //this指向window,打印结果:1复制代码
4.箭头函数this指向问题
// 箭头函数没有this,箭头的函数的this指向需要根据上下文来判断 //先来一个简单的例子吧,比如说定时器 var a = 1; var b = { a:2, c:setInterval(()=>{ console.log(this.a,'this指向') },1000) } b.c;复制代码
这里在 window
上调用 b.c
箭头函数的 this
指向的是全局,所以会打印 1
在上面的堆内存中相同的例子,只是因为箭头函数和普通函数,所以 this
指向的方向也变得不同,这里需要特别:warning:注意,最好在函数内部保存一下全局变量 this!!!
(:warning::warning::warning:)
这样相信你对 this
也有了一定的理解,下面我们来看下关于的 this
指针的面试题吧
5, 面试高频this指针问题
var a = 1; var obj = { a:2, c:3, b:function(a,c) { console.log(a+c); } } var fn = obj.b(this.a,this.c); console.log(fn); var fn1 = obj.b.call(this.obj,this.a,this.c); console.log(fn1)复制代码
首先,分析下这道题
// 这里的this指向的是window,相信大家都没问题 var fn = obj.b(this.a,this.c); //打印结果 NaN,只在全局变量中找到了this.a,this.c 未定义所以为undefind,数字 + undefind = NaN 复制代码
// 这里本来this指向的是window,但是使用了call()将函数的this指向由window指向了obj var fn1 = obj.b.call(this.obj,this.a,this.c); //打印结果为5,在this.obj中找到了 this.a = 2,this.c = 3;复制代码
以上就是this的基本使用场景,如果大家还有更多好玩的操作,可以在下面留言:pray:
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 用脏办法解决 BLE 鼠标重连后指针不动的问题
- golang的相关问题(返回局部变量指针、分配原语、init、值与引用、接口、内建函数等等)
- 《新版阿里巴巴 Java 开发手册》提到的三目运算符的空指针问题到底是个怎么回事?
- NULL 指针、零指针、野指针
- 将数组和矩阵传递给函数,作为C中指针的指针和指针
- C语言指针数组和数组指针
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。