You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

箭头函数的this始终指向window/全局?能否指向非全局对象?

箭头函数的this指向规则详解

首先直接给结论:箭头函数的this并不是始终指向window/全局对象,它的指向完全由**定义时所在的外层作用域的this**决定,而不是调用时的上下文。

先分析你的代码困惑

你最初写的funcTest2b: ()=>console.log("test _2b: "+ this),不管是直接调用obj.obj1.obj2.funcTest2b(),还是在obj.obj1.obj3.test3()里面调用,它的this都是window。这是因为这个箭头函数定义在obj2对象的属性里,它的外层没有普通函数(对象的属性赋值不属于函数作用域),所以它会直接继承最顶层的全局作用域的this,也就是浏览器里的window。

箭头函数如何指向非全局对象?

想要让箭头函数的this指向某个非全局对象,核心是把箭头函数定义在一个普通函数内部,这个普通函数的this就是你想要的对象,箭头函数会自动继承这个this。

比如你找到的这个例子:

a = { 
  hello: 'hola', 
  b() { 
    return () => { 
      console.log(this.hello) //or this; 
    } 
  } 
} 
a.b()() // print hola

这里b是普通函数,当你调用a.b()时,b的this指向a;而返回的箭头函数定义在b内部,所以它的this就继承了b的this,也就是a,所以最终能打印出hola。

再看你修改后的funcTest2b:

funcTest2b: function(){ 
  let testInside=()=>console.log("test _2b: "+ this) 
  testInside() 
}

当你调用obj.obj1.obj2.funcTest2b()时,外层的普通函数funcTest2b的this指向obj2,里面的箭头函数testInside定义在这个普通函数里,所以它的this就继承了funcTest2b的this,也就是obj2,这样就实现了让箭头函数的this指向非全局对象。

关键总结

  • 箭头函数没有自己的this,它的this是定义时外层最近的普通函数的this;
  • 如果箭头函数外层没有普通函数,才会指向全局对象(浏览器是window,Node.js是global);
  • 箭头函数的this一旦定义就固定了,无法通过call/apply/bind修改,想要改变它的指向,本质是改变它外层普通函数的this指向。

内容的提问来源于stack exchange,提问作者Angelotti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:35:05