setTimeout里改变this指向

var name= 1; 
var MyObj = { 
    name: 2, 
    showName: function(){ console.log(this.name); 
    } 
} 
setTimeout(MyObj.showName,1000)

这里输出的是 1,因为这段代码在编译的时候,执行上下文中的 this 会被设置为全局 window,如果是严格模式,会被设置为 undefined。
但当我使用箭头函数时,

setTimeout(() => { MyObj.showName() }, 1000);

可以正常输出2,但箭头函数不是不改变this指向的吗?

阅读 2.3k
1 个回答
setTimeout(function(){ MyObj.showName() }, 1000);
setTimeout('MyObj.showName', 1000);

先要明确一点:MyObj.showName()MyObj.showName 是不一样的。举个例子:

a = MyObj.showName()
b = MyObj.showName

a 是调用了方法,然后存储了返回值
b 是直接存储了方法


然后在明确一下,this 的指向:

  1. 默认情况指向调用对象
  2. ()=> 箭头函数情况下,指向定义时的 this
  3. bind、call、apply,指向传入的对象,但是无法改变箭头函数的

那么回到原始的问题:

  1. MyObj.showName() 调用对象就是 MyObj
  2. b = MyObj.showName;b() 调用对象可以理解为 window
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题