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

时间:2015-04-13 17:27:50

标签: javascript namespaces javascript-namespaces

在用于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();

直接从bar调用foo时,一切都按照我的预期运行:它会打印123123
但是,从bar调用setTimeout时,会打印undefined123

似乎第二种方式bar被称为this的值不是我所期望的。我希望它是myNamespace但似乎是window


这引出了两个问题:

  1. 有没有办法让this内的bar值始终指向myNamespace,无论它从何处被调用?
  2. myNamespace.内代替this.进行硬编码是否更合适?

1 个答案:

答案 0 :(得分:2)

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

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