嘿,我这里有这个代码: http://pastie.org/534470
在第109行我得到一个错误,说“TypeError:表达式结果'this.allVarsDefined'[undefined]不是函数。”
javascript中的范围让我感到困惑。有人能看出我的问题是什么吗?你们也知道任何有助于我了解javascript范围的文章。这是我第一次真正使用JS:)
答案 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写一个网络应用程序,它会非常有帮助。
如果我的解决方案不起作用,那么将代码简化为您认为应该工作且不起作用的最基本的东西,然后在此处发布。