使用命名空间时"this"的意外值



在JavaScript中用于命名空间时,我似乎遇到了一些关于this的问题。 具体来说,每当我通过setTimeoutsetInterval调用命名空间函数时,我似乎不再使用正确的 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时,一切都按照我的预期工作:它打印123123
但是,当从setTimeout调用bar时,它会打印undefined123

似乎第二种方式被称为barthis的价值不是我所期望的。 我希望它是myNamespace,但它似乎很window.


这让我想到两个问题:

  1. 有没有办法将this值保留在bar始终指向myNamespace,而不管它从哪里调用
  2. ?硬
  3. 编码myNamespace.代替bar内部的this.是否更合适?

这是因为this根据作用域而变化,一种方法是绑定匿名函数:

setTimeout(function(){this.bar()}.bind(this), 250);

最新更新