14.1介绍this是javascript中的关键字,用法类似于变量,是执行上下文的重要组成部分。它的作用是获取函数体内当前的运行环境。14.2每个函数的this指向是根据函数调用时的执行环境绑定的,this的指向完全取决于函数的调用位置。(以下是在浏览器环境下测试的结果)在全局环境下,无论是否在严格模式下,this始终指向全局对象(window);console.log(this);//window里面的this普通函数分为两种情况,严格模式和非严格模式。(1)非严格模式下,this默认指向全局对象window(2)严格模式下,this为undefinedfunctionfun(){console.1)函数的定义位置不影响它的this点,只与调用该函数的对象有关;(2)对于多层嵌套对象,内部方法的this指向离被调用函数最近的对象(window也是一个对象,其内部对象调用方法的this指向内部对象,不是window).constobj={a:10,b:20,add:function(){returnthis.a+this.b;}};console.log(obj.add());//30constadd=obj.add;console.log(add());//NaN原型链中方法的this仍然指向调用它的对象constobj={a:10,b:20};constprototypeObj={add:function(){returnthis.a+this.b;}};Object.setPrototypeOf(obj,prototypeObj);console.log(obj.add());//30当函数被调用的方法call()和apply()继承自prototypeFunction对象,其函数内部的this值可以绑定到call()&apply()方法指定的第一个对象。如果第一个参数不是对象,JavaScript会尝试将其转换为对象,然后指向它。(见后续代码)通过bind方法绑定后,无论在什么情况下被调用,函数都会一直绑定到它的第一个参数对象上。(见后续代码)当该函数用作监听事件处理器时,其this指向触发事件的元素(对于addEventListener事件)buttonconstbtn=document.getElementById('testId');btn.addEventListener('click',function(){console.log(this);//按钮});内联事件中的this有两种情况:(1)当代码被内联处理函数调用时,其this指向监听器所在的DOM元素button//输出DOM节点(2)当代码包含在函数的执行中时,其this点相当于直接调用函数,即指向全局对象window中非严格模式,并指向严格模式下未定义的buttonfunctionclickFun(){console.log(this);//window}里面的回调函数delay函数,this指向全局对象window(当然其内部函数的this点可以通过bind方法改变)functionFun(){this.a=10;this.method=function(){setTimeout(function(){console.log(this);//window},1000);}}constfun=newFun();fun.method();由于箭头函数没有绑定如果你设置了this,它会捕获它的上下文(也就是定义它的地方)的this值作为自己的this值,所以call()/apply()/bind()方法只是箭头函数的传入参数,对于它this没有任何作用。functionFun(){this.a=10;this.method=function(){setTimeout(()=>{console.log(this);//Fun{a:10,method:?}},1000);}}constfun=newFun();fun.method();14.3改变this的方向除了隐式绑定this之外,还可以通过调用、应用、显式绑定来改变this的方向。对于这三者,后续会有专门的百题来说明区别。本节主要讲一波简单的使用。call()call()方法使用指定的this值和一个或多个单独给定的参数调用一个函数。functionmethod(val1,val2){returnthis.a+this.b+val1+val2;}constobj={a:1,b:2};console.log(method.call(obj,3,4));//10apply()apply()方法调用一个带有给定this值的函数,参数以数组(或类数组对象)的形式提供。functionmethod(val1,val2){returnthis.a+this.b+val1+val2;}constobj={a:1,b:2};console.log(method.apply(obj,[3,4]));//10bind()bind()方法创建一个新函数。调用bind()时,这个新函数的this被指定为bind()的第一个参数,其余参数将作为新函数的参数。调用时使用。functionmethod(val1,val2){returnthis.a+this.b+val1+val2;}constobj={a:1,b:2};constbindMethod=method.bind(obj,3,4);console.log(bindMethod);//[Function:boundmethod]console.log(bindMethod());//10扩展的call()和apply()的区别在于call()方法接受的是参数列表,而apply()方法接受参数数组;bind返回绑定函数,call和apply返回运行结果;多次bind()无效,只会绑定第一次调用的对象;call()/apply()/bind()方法只是给箭头函数传入参数,对其this没有影响。本文转载自微信公众号“牵着风筝”,可通过以下二维码关注。转载本文请联系风筝持有人公众号。