0

this关于 JavaScript 中的命名空间,我似乎遇到了一些问题。具体来说,每当我调用命名空间函数时,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一切工作中直接调用,就像我期望的那样:它打印123123.
但是,当bar从 调用时setTimeout,它会打印undefinedand 123

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


这让我想到了两个问题:

  1. 有没有办法让thisbar始终指向内部,myNamespace而不管它是从哪里调用的?
  2. myNamespace.用硬编码代替this.inside of会更合适bar吗?
4

1 回答 1

2

那是因为this根据范围进行更改,一种方法是绑定匿名函数:

setTimeout(function(){this.bar()}.bind(this), 250);
于 2015-04-13T17:30:26.233 回答