写之前先做个分类,大致有这6种情况:runtimeoftheclosestfunctionatruntimethisincall,bind,apply,etc.//指向重定向的this箭头函数thisincall,bind,apply等。//runtimeoftheclosestfunctionatdefinitionthisin回调函数//虚调用,指向回调函数中的全局箭头函数this//定义中的this在运行时最接近函数由浅入深分析:1.函数中的this指向最基本的this调用者自己指向问题,哪个对象调用指向这个对象。比如在dom操作中:document.getElementById('btn').onclick=function(){console.log(this);}//当btn被点击时,this指向document.getElementById('btn')这里的onclick是一个函数,当clicked=>document.getElementById('btn')调用onclick函数,所以指向document.getElementById('btn');例如,在Object:constman={age:18,getAge:function(){console.log(this.age)},};window.age=0;man.getAge();//18constgetAge=man.getAge;getAge();//0getAge只是一个函数,当man调用时指向man,全局调用时指向window(严格模式下指向undefined,下篇文章会讲内存)2.箭头函数()=>thisin{}//定义时最近的函数的this听起来有点绕,其实道理比较简单。箭头函数本身的设计是针对匿名函数的,没有自己的this和arguments,两者在定义的时候都附加到最近的函数上。函数,而一个函数运行时的this依赖于调用对象,所以组合就是最接近定义时的函数+运行时的this。举3个例子:1.consta={cb:function(){setTimeout(()=>console.log(this))}};constfn=()=>console.log(this);//箭头函数,定义在全局2.constb={cb:function(){setTimeout(fn)}}//通过变量名导入b.cb3.constc={cb:function(params_fn){设置超时(标准ams_fn)}}//实验中会通过传参的方式将fn引入到c.cb中,然后逐一运行a.cb()//this指向a,因为箭头定义了最接近的函数->cb,this是附加在cb上的,当cb运行时,由a调用。b.cb()//this指向window,因为箭头定义是void定义,指向整个世界,所以运行时指向windowc.cb(fn)//this指向window,原因是同上b的例子不足以证明这是最接近的附函数,加个constcb=a.cb;cb();//thispointstowindow可以看出箭头函数的this在定义的时候是直接依附在最近的函数上,this的指向取决于依附函数3+4的运行环境。bind、call、apply这三个很简单,因为用过的都知道,这是强行改变this的方向,比如bind('hard'),相当于一个装饰器,直接this='hard',但是因为箭头函数没有this和arguments,所以对箭头函数没有生效,箭头函数的指针没有受到影响5+6。回调函数中的this指向回调函数,不管是function还是()=>{},运行时其实都属于空操作。什么是空操作就是没有调用对象,当没有调用对象时,函数的this一般指向全局(严格模式下是undefined),箭头函数还是依赖附加的this来确定这个方向。回调函数通常定义在一个函数内。箭头函数可以在不改变回调函数内部的this点的情况下轻松判断this的方向,所以这也是回调函数中经常使用箭头函数的原因。展开:防抖功能防抖功能的知识点本身就是一个闭包,但是里面的一个定时器就是用这个指向的技巧写了一个正则防抖功能dobounce(fn,time=1000){let超时=空;//创建一个变量returnfunction(){if(timeout)clearTimeout(timeout);//如果有定时器,清除定时器timeout=setTimeout(()=>fn.apply(this,arguments),time);//重新创建定时器}}这里setTimeout()中的箭头函数直接继承了闭包返回值函数的this和arguments,然后调用这个debouncea={name:4,test:dobounce(function(a,b){console.log(this.name+a+b)})};a.test(5,6)//15但是防抖中传入的fn不应该使用箭头函数,原因参??考this箭头函数指向问题。总结:因为箭头函数没有自己的this,所以不会被外界的各种因素改变。它仅附加到最接近定义的函数。一般来说,this依赖于调用对象,但是可以bind,call,Apply等改变this的指向,如果白跑了(在回调函数中,指向全局)
