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

JS箭头函数this指向疑问:嵌套对象内箭头函数为何打印全局对象

问题核心原因

你对箭头函数this指向的理解偏差,核心是混淆了对象字面量的花括号和词法作用域边界的概念。

箭头函数的this绑定规则:在箭头函数中,this会保留其封闭词法上下文的this值,在全局代码中,它会被设置为全局对象。

  • 首先要明确两个核心前提:
    • 箭头函数的this是定义时静态绑定的,继承自外层词法作用域的this,和调用方式、挂载的对象没有任何关系
    • 只有全局作用域、函数作用域、let/const所在的块级作用域会形成词法边界,对象字面量的花括号不会创建新的词法作用域
  • 回到你的代码:
    你定义apple箭头函数时,它所在的上下文是obj的对象字面量内部,对象的{}不产生新作用域,所以apple的外层词法作用域就是你定义outerObj时所在的全局作用域,全局作用域的this自然是全局对象,因此执行outerObj.obj.apple()时会打印全局对象。
  • 你预期的this指向obj的逻辑,是普通函数作为对象方法调用时的动态绑定规则,和箭头函数的规则完全不同。如果要实现你的预期,有两种常用写法:
    1. 把apple改为普通函数,利用普通函数调用时的动态this绑定:
    const outerObj = {
          lemon:5,
          obj:{
            egg:5,
            apple: function () {console.log(this)}
          }
        }
    outerObj.obj.apple() // 输出 { egg: 5, apple: [Function: apple] }
    
    1. 把箭头函数定义在普通函数内部,继承普通函数的this:
    const outerObj = {
          lemon:5,
          obj:{
            egg:5,
            apple: function () {
              const innerFn = () => console.log(this)
              innerFn()
            }
          }
        }
    outerObj.obj.apple() // 同样输出obj对象
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:57:02