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

Mav*_*ick 1 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();?
Run Code Online (Sandbox Code Playgroud)

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

我尝试var that = this了我的bar方法和引用that.foo,that.bar但它没有改变任何东西.我也在var that = this我的return陈述之上尝试过,问题仍然存在.

预期结果:

FOO

FOO

FOO

FOO

... 等等

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

FOO

未定义

Nie*_*sol 5

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

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

var that = this;
setTimeout(function() {that.bar.apply(that);},500);
Run Code Online (Sandbox Code Playgroud)