在日常开发中,我们经常会遇到这个指向的bug。郁闷了半天,猛然醒悟,痛定思痛。总结一下,以免以后的开发工作走弯路。注意:本文描述仅针对浏览器环境。1.全局执行可以看出,在全局范围内this指向当前全局对象Window。2.在函数中执行非严格模式严格模式3.作为对象的方法调用当函数作为对象的方法被调用时,this指向当前对象obj:如果对象的方法给变量赋值.调用该方法时,this指向Window:四、在JS中用作构造函数。为了实现一个类,我们需要定义一些构造函数,在调用构造函数的时候加上new关键字:此时this指向调用构造函数时实例化的对象。当然,构造函数实际上是一个函数。如果构造函数作为普通函数调用,则this指向Window:5.在定时器中使用如果没有特殊指向(指向变化见下文:如何改变this的指向),this的指向在setInterval和setTimeout的回调函数是Window。这是因为JS的timer方法是定义在Window下的。6.箭头函数在全局环境中调用:作为对象的函数调用:不难发现,普通函数作为对象的函数调用,this指向obj,调用箭头函数作为对象的函数,this指向Window。特例:结合定时器调用:如果在对象的函数中,调用普通函数作为延时执行定时器的函数,this指向Window;箭头函数作为定时器延迟执行的函数被调用,this指向定义时所在位置的对象,也就是func中的this,即obj。箭头函数中this的值取决于函数外非箭头函数的this值,this的值不能通过call()、apply()、bind()方法改变。七、call、apply、bindcall:fun.call(thisArg[,arg1[,arg2[,...]]])会立即执行函数,第一个参数是指定执行函数中this的上下文,以及下面的参数是执行函数需要传入的参数;apply:fun.apply(thisArg,[argsArray])也会立即执行函数,第一个参数是指定执行函数中this的上下文,第二个参数是一个数组,是传递给执行的参数函数(与调用的区别);绑定:varfoo=fun.bind(thisArg[,arg1[,arg2[,...]]]);它不会执行该函数,而是返回一个新函数,这个新函数被赋予了this的上下文,后面的参数是执行该函数需要传入的参数;看一个例子:在这个例子中,call、apply、bind的this都指向obj,都正常运行;call和apply将立即执行函数。call和apply的区别在于传递的参数。call接收多个参数列表,apply接收一个包含多个参数的数组;bind不是立即执行函数,它返回一个函数,需要执行p2返回结果,bind接收多个参数列表。Application:Howtochangethedirectionofthis为什么要讲这个模块,是为了方便更透彻的理解上面介绍的this指向的问题,更透彻的理解JS函数中三个重要的方法:call的使用,申请并绑定;而且在实际的项目开发中,我们经常会遇到需要改变this的点的情况。使用es6的箭头函数此时会报错,因为setTimeout中函数的this指向的是Window,而Window对象上并没有func1函数。接下来我们把它改成箭头函数:这个时候不会报错,因为箭头函数的this的值依赖于函数外的非箭头函数的this的值,即func2的this,即obj。在函数内部使用_this=this此时,func2也可以正常工作了。在func2中,首先设置var_this=this,这里this是指向func2的对象obj,为了防止func2中的setTimeout被window调用,setTimeout中的this是window。我们把this(指向变量obj)赋值给一个变量_this,这样我们在func2中使用_this指向对象obj。使用call、apply、bindcall:apply:bind:call、apply、bind都可以改变this的context对象,所以不会报错,可以正常执行。具体原因可以看上面第七点,call,apply,bind。new实例化一个对象如上:第四点,作为构造函数。喜欢小编的文章可以点击关注哦~
