Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
162 views
in Technique[技术] by (71.8m points)

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)
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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share

2.1m questions

2.1m answers

63 comments

56.7k users

...