首页 > 解决方案 > JavaScript中箭头函数中的“this”是什么

问题描述

我对箭头函数中的“this”指向什么有疑问:

// run this file in nodejs by: node test_this.js
const obj = {
  scope:this,
  func1:()=>{return this},
  func2:function(){
    const fn = ()=>this;
    return fn(); 
  }
}
console.log("0",obj.scope); // module.exports
console.log("1",obj.func1()); // module.exports
console.log("2",obj.func2()); //obj

const newFunc2 = obj.func2;
console.log("newFunc2",newFunc2()); //global

据我所知,箭头函数没有自己的“this”。一旦声明了箭头函数,作用域就决定了“this”,它永远不会改变。但是为什么console.log("2",obj.func2());输出obj? 为什么要console.log("newFunc2",newFunc2());打印不同的结果global

标签: javascriptnode.jsscopethisarrow-functions

解决方案


this您的obj声明的词法值为module.exports. 那是声明变量this时的值。obj

  1. 所以,这解释了为什么obj.scopemodule.exports因为这是在this你的对象被声明并用你的代码初始化时的值scope:this,

  2. 正如您似乎已经知道的那样,使用 as in 对象调用箭头函数声明时obj.func1()不会执行objas this。相反,它使用this(在声明时是什么)的词法版本。如图所示,的obj.scope词法值为。所以,结果符合预期(因为被定义为箭头函数。thismodule.exportsconsole.log("1",obj.func1())module.exportsfunc1

  3. 然后, with obj.func2(), that 被声明为一个普通函数,所以thisinside of的值func2,当调用 as 时obj.func2()将是obj。这就是方法函数调用obj.func2()在 Javascript 中的工作方式(只要函数是普通函数定义或方法定义,而不是箭头函数)。

最后,当你这样做时:

const newFunc2 = obj.func2;

您将获得对 JUSTfunc2方法的引用,这一切都是单独的。您只隔离了该方法,它与该对象完全没有关联。所以,当你这样称呼它时:

console.log("newFunc2",newFunc2());

引用的对象obj完全消失了,该this值将被设置为与任何普通函数调用相同。如果您正在运行严格模式,则该值this将设置为,如果不运行严格模式,则该值将设置为该值。undefinedglobal

有关所有这些工作原理的评论或未来的参考,请参阅:

this 的值在执行时在函数内部确定的 6 种方式


推荐阅读