我的代码中出现“this.function”和Scope的问题

时间:2009-07-05 00:40:01

标签: javascript ajax scope this

嘿,我这里有这个代码: http://pastie.org/534470

在第109行我得到一个错误,说“TypeError:表达式结果'this.allVarsDefined'[undefined]不是函数。”

javascript中的范围让我感到困惑。有人能看出我的问题是什么吗?你们也知道任何有助于我了解javascript范围的文章。这是我第一次真正使用JS:)

2 个答案:

答案 0 :(得分:2)

这看起来基于原型。您可能需要设置通知回调,如下所示:

setTimeout(this.notify.bind(this), 5000, track);

以便将notify函数绑定到Scrobbler对象并将this设置为Scrobbler对象,而不是在超时发生时触发该函数的事件。

如果我使用原型我错了,你可以使用

达到同样的效果
var that = this;
setTimeout( function() { that.notify(); }, 5000, track );

答案 1 :(得分:0)

尝试从

更改第109行
setTimeout(this.notify, 5000, track);

setTimeout(function(){this.notify()}, 5000, track);

这将做的是创建“closure”(function(){this.notify()}),其中包含“this”变量,“this”包含this.allVarsDefined,所以你应该停止得到那个错误

我认为旧代码的问题在于,当你编写“this.notify”时,你只是将该函数从对象实例中移出并将其传递给setTimeout,但是你没有传递任何关于该对象的信息本身。如果notify函数没有引用“this”,那也没关系,但是因为它确实引用了“this”,所以你需要使用一个闭包。

通过阅读有关Javascript闭包的更多信息,您将受益匪浅。这是a decent article。我还推荐O'Reilly出版的好书Java Script: The Definitive Guide 5th Edition。它的价格只有50美元,但写得很好,如果你想用javascript写一个网络应用程序,它会非常有帮助。

如果我的解决方案不起作用,那么将代码简化为您认为应该工作且不起作用的最基本的东西,然后在此处发布。