让我们看看例子:
第一
var user = {
firstName: "John",
sayHi: function() {
alert( this.firstName );
}
};
setTimeout(function() {
user.sayHi(); // John
}, 1000);
第二
var user = {
firstName: "John",
sayHi: function() {
alert( this.firstName );
}
};
setTimeout(user.sayHi, 1000);// undefined
为什么在第二个示例 undefined ?这是如何工作的?
答案 0 :(得分:4)
当您将函数引用传递给setTimeout
函数时,传递的函数引用将在window
范围内执行。因此,window.firstName
将为undefined
,因为您没有window
这样的对象中的任何属性。
var user = {
firstName: "John",
sayHi: function() {
alert( this.firstName );
}
};
setTimeout(user.sayHi.bind(user), 1000);
因此,您可以在上面的代码中看到,您必须将范围显式绑定到函数引用。而且你也可以使用传统的方式,即使用如下的匿名函数,
setTimeout(function(){ user.sayHi(); }, 1000);