1

我正在尝试创建一个递归方法,但它正在失去对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陈述,但问题仍然存在。

预期结果:

... 等等

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

不明确的

4

3 回答 3

5

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

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

var that = this;
setTimeout(function() {that.bar.apply(that);},500);
于 2012-12-28T22:46:23.997 回答
0
foo = {
    foo: 'bar',
    bar: function() {
        console.log(foo.foo);
        setTimeout(foo.bar, 500);
    }
};
foo.bar();​

这也可以解决问题。

于 2012-12-28T22:54:16.683 回答
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();​
于 2012-12-28T22:49:10.520 回答