为什么`this`失去了对我的对象的绑定?

时间:2012-12-28 22:42:55

标签: javascript recursion this javascript-objects

我正在尝试制作一个递归方法,但它正在失去与this的绑定。以下是重新创建问题的最简单方法:

var Foo = function() {
    return {
        foo : 'foo',
        bar : function() {
            co​nsole.log(this.foo);
            setTimeout(this.bar, 500);
        }
    }​;
}
var foo = new Foo();
foo.bar();​

那只会跑两次。它第一次将foo记录到控制台,第二次记录undefined。然后当然,它将不再运行,因为bar不再是this的属性,因为我认为它已重置为全局对象。

我在var that = this方法中尝试了bar并引用了that.foothat.bar,但它没有改变任何内容。我还在var that = this声明之上尝试了return,问题仍然存在。

预期结果:

  

FOO

     

FOO

     

FOO

     

FOO

     

......等等

以下是一个示例http://jsfiddle.net/k2hTJ/,结果如下:

  

FOO

     

未定义

3 个答案:

答案 0 :(得分:5)

setTimeout将在当前范围内调用其函数,但this作为全局对象。

解决此问题的最佳方法是执行以下操作:

var that = this;
setTimeout(function() {that.bar.apply(that);},500);

答案 1 :(得分:0)

这有效:

var Foo = function() {
    return {
        foo : 'foo',
        bar : function() {
            co​nsole.log(this.foo);
            setTimeout(this.bar(), 500); //Add '()'
        }
    }​;
}
var foo = new Foo();
foo.bar();​

答案 2 :(得分:0)

foo = {
    foo: 'bar',
    bar: function() {
        console.log(foo.foo);
        setTimeout(foo.bar, 500);
    }
};
foo.bar();​

这也可以解决问题。