【发布时间】:2015-06-19 02:54:52
【问题描述】:
当用于 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。
但是,当从setTimeout 调用bar 时,它会打印undefined 和123。
看来bar的第二种调用方式this的值不是我所期望的。我希望它是myNamespace,但它似乎是window。
这让我想到了两个问题:
- 有没有办法让
this内的bar值始终指向myNamespace,无论它是从哪里调用的? - 在
bar内部硬编码myNamespace.代替this.是否更合适?
【问题讨论】:
标签: javascript namespaces javascript-namespaces