我正在尝试制作一个递归方法,但它正在失去与this
的绑定。以下是重新创建问题的最简单方法:
var Foo = function() {
return {
foo : 'foo',
bar : function() {
console.log(this.foo);
setTimeout(this.bar, 500);
}
};
}
var foo = new Foo();
foo.bar();
那只会跑两次。它第一次将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
未定义
答案 0 :(得分:5)
setTimeout
将在当前范围内调用其函数,但this
作为全局对象。
解决此问题的最佳方法是执行以下操作:
var that = this;
setTimeout(function() {that.bar.apply(that);},500);
答案 1 :(得分:0)
这有效:
var Foo = function() {
return {
foo : 'foo',
bar : function() {
console.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();
这也可以解决问题。