【发布时间】:2012-12-14 03:26:28
【问题描述】:
我正在尝试创建一个递归方法,但它正在失去与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 的属性,因为我假设它被重置为全局对象。
我在bar 方法中尝试了var that = this,并引用了that.foo 和that.bar,但它并没有改变任何东西。我还在return 声明上方尝试了var that = this,但问题仍然存在。
预期结果:
富
富
富
富
...等等
这是一个示例 http://jsfiddle.net/k2hTJ/,它会导致:
富
未定义
【问题讨论】:
-
因为
this在函数范围内被覆盖了。 -
我们应该为
that = this、self = this的难题想出一个名字,这个难题似乎每天都困扰着 JavaScript 开发人员。 -
从你的代码看起来,我推断你正在学习模块模式。太棒了,但如果你不介意我迂腐的话:在这种情况下,原型方法可能更合适,因为现在你正在为每个新实例创建一个新的函数对象......所有
bar属性都是单独的对象做同样的事情。这并不理想。如果您不想增加原型,当然也可以使用闭包 -
你能帮我用模块模式发一下上面的代码吗?
标签: javascript recursion this javascript-objects