在用于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();
直接从bar
调用foo
时,一切都按照我的预期运行:它会打印123
和123
。
但是,从bar
调用setTimeout
时,会打印undefined
和123
。
似乎第二种方式bar
被称为this
的值不是我所期望的。我希望它是myNamespace
但似乎是window
。
这引出了两个问题:
this
内的bar
值始终指向myNamespace
,无论它从何处被调用?myNamespace.
内代替this.
进行硬编码是否更合适?答案 0 :(得分:2)
这是因为this
根据范围而变化,一种方法是绑定匿名函数:
setTimeout(function(){this.bar()}.bind(this), 250);