在JavaScript中用于命名空间时,我似乎遇到了一些关于this
的问题。 具体来说,每当我通过setTimeout
或setInterval
调用命名空间函数时,我似乎不再使用正确的 this
值。
例如,请考虑以下代码:
var myNamespace = {
myVar: 123,
foo: function () {
console.log('Inside foo');
console.log('this.myVar = ' + this.myVar);
console.log('myNamespace.myVar = ' + myNamespace.myVar);
// This works excactly as expected, it prints 123 and 123
this.bar();
// This does not, it prints undefined and 123
setTimeout(this.bar, 250);
},
bar: function () {
console.log('Inside bar');
console.log('this.myVar = ' + this.myVar);
console.log('myNamespace.myVar = ' + myNamespace.myVar);
}
}
myNamespace.foo();
当直接从foo
调用bar
时,一切都按照我的预期工作:它打印123
和123
。
但是,当从setTimeout
调用bar
时,它会打印undefined
并123
。
似乎第二种方式被称为bar
,this
的价值不是我所期望的。 我希望它是myNamespace
,但它似乎很window
.
这让我想到两个问题:
- 有没有办法将
this
值保留在bar
始终指向myNamespace
,而不管它从哪里调用
?硬 - 编码
myNamespace.
代替bar
内部的this.
是否更合适?
这是因为this
根据作用域而变化,一种方法是绑定匿名函数:
setTimeout(function(){this.bar()}.bind(this), 250);