当前位置: 首页 > 后端技术 > Node.js

补充4:this指向

时间:2023-04-03 11:47:06 Node.js

JavaScript中this的指向取决于调用函数的人,而不取决于函数的定义。例1functionfn(){console.log(this)}fn()上面的例子中,fn被全局对象调用,所以this指向了全局对象。例子2constobj={foo:function(){console.log(this)}}letfn=obj.foofn()obj.foo()在上面的例子中,fn方法指向obj.foo,因为fn方法被全局对象调用,所以this指向全局对象。而不是直接调用obj.foo(),foo方法是由obj调用的,所以this指向obj。例3functionFoo(){console.log(this)}constf=newFoo()在上面的例子中,FunctionFoo被实现为一个构造函数,this指向实际对象f。ES2015中的class关键字是一种语法糖,其本质是声明一个构造函数,所以其内部的this指向一个引用构造函数。例4functionfoo(){return()=>{console.log(this)}}foo()()箭头函数虽然也是一个函数,但是并没有改变内部的this点,也就是说,它在搜索箭头函数内部,当this指向时,搜索仍然是包裹它的函数的调用者。上面的例子中,foo函数返回的函数是全局对象调用的,所以this指向的是全局对象。综合以上四个例子,可以得出JavaScript中查找this的步骤是:沿着作用域链从里到外查找最近的函数(箭头函数不是函数),看谁调用了这个函数到底。由全局对象调用(作为函数调用),如foo(),this指向全局对象。被其他对象调用(作为方法调用),比如foo.bar(),this指向最后调用这个方法的对象。作为构造函数调用,比如newPerson,this指向新生成的实现对象。特殊调用,如fn.call、fn.apply、fn.bind,此时this指向调用时传入的参数。如果找不到该函数,则指向全局对象。this指向的全局对象是什么?上面多次提到this指向全局对象,那么这个全局对象到底是什么呢?在浏览器环境的非严格模式下,全局对象是window。在严格模式下,全局对象是未定义的。在node环境下,如果在命令行中通过node*.js执行,可以分为以下两种情况。如果this不在任何函数范围内if(true){console.log(this)}console.log(this)//trueconsole.log(this===module.exports)在上面的例子中,this指向{}。因为nodejs保证了文件的模块作用域,所以在执行文件代码的时候,会在所有的文件代码中加入一个wrapper函数。上面的执行类似于://exports指向module.exportsfunctionwrapped(exports){if(true){console.log(this)}console.log(this)}wrapped()所以this将指向{}。如果this在函数范围内,则this指向调用者。functionfn(){console.log(this)}fn()上面的例子中fn是被全局对象调用的,但是在node环境下,全局对象是Global,所以this指向的是Global。