H5W3
当前位置:H5W3 > 其他技术问题 > 正文

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指向的吗?

回答

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

未经允许不得转载:H5W3 » setTimeout里改变this指向

赞 (0)

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址