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

箭头函数与setTimeout作用域测试结果与教程结论相悖的疑问

setTimeout中箭头函数与普通函数的this指向争议

我正在学习JavaScript教程,教程里说不应在setTimeout中使用箭头函数,理由是箭头函数会指向window作用域而非封闭作用域。但我的测试结果刚好相反:命名函数指向window,箭头函数却能正确指向目标对象。

测试代码

const dude = {
  name: 'dude',
  namedFunc() {
    console.log('name 1: ', this.name); // Dude

    setTimeout(function() {
      console.log('this 1:', this);
      console.log('name 2:', this.name); // undefined
    }, 200);
  },
  arrowFunc() {
    console.log('name 3:', this.name); // Dude

    setTimeout(() => {
      console.log('this 2:', this); // {name: 'dude', nameWNamed: ƒ, nameWArrow: ƒ}

      console.log('name 4:', this.name); // Dude
    }, 300)
  }
}

console.log('namedFunc:', dude.namedFunc()); // Dude
console.log('arrowFunc:', dude.arrowFunc()); // Dude

教程给出的预期输出

this 1: {name: 'dude', namedFunc: ƒ, arrowFunc: ƒ}
name 2: dude
this 2: Window {window: Window, self: Window, document: document, name: '', location: Location, …}
name 4: 

我的实际输出

this 1: Window {window: Window, self: Window, document: document, name: '', location: Location, …}
name 2: 
this 2: {name: 'dude', namedFunc: ƒ, arrowFunc: ƒ}
name 4: dude

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 03:03:41