嘿,我在这里有这段代码:http: //pastie.org/534470
在第 109 行,我收到一条错误消息:“TypeError:表达式'this.allVarsDefined' [undefined] 的结果不是函数。”
javascript 中的范围让我感到困惑。任何人都可以看到我的问题是什么?你们还知道任何可以帮助我了解 javascript 范围的文章吗?这是我第一次真正使用 JS :)
嘿,我在这里有这段代码:http: //pastie.org/534470
在第 109 行,我收到一条错误消息:“TypeError:表达式'this.allVarsDefined' [undefined] 的结果不是函数。”
javascript 中的范围让我感到困惑。任何人都可以看到我的问题是什么?你们还知道任何可以帮助我了解 javascript 范围的文章吗?这是我第一次真正使用 JS :)
这看起来是基于原型的。您可能需要像这样设置通知回调:
setTimeout(this.notify.bind(this), 5000, track);
以便通知函数绑定到 Scrobbler 对象并this
设置为 Scrobbler 对象,而不是在发生超时时触发函数的事件。
如果我错了你使用原型,你可能可以达到相同的效果使用
var that = this;
setTimeout( function() { that.notify(); }, 5000, track );
尝试将第 109 行从
setTimeout(this.notify, 5000, track);
到
setTimeout(function(){this.notify()}, 5000, track);
这将创建包含“this”变量的“闭包”(function(){this.notify()}),并且“this”包含this.allVarsDefined,因此您应该停止出现该错误。
我认为您的旧代码的问题在于,当您编写“this.notify”时,您只是将函数从对象的实例中拉出并将其传递给 setTimeout,但您没有传递有关对象本身的任何信息。如果 notify 函数没有引用“this”,那就没问题了,但是由于它确实引用了“this”,所以您需要使用闭包。
阅读更多关于 Javascript 闭包的信息会让您受益匪浅。这是一篇不错的文章。我还推荐了O'Reilly的《 Java Script: The Definitive Guide 5th Edition》这本书。它只需要 50 美元,但它写得很好,如果你想用 javascript 编写一个 web 应用程序,它将为你提供极大的帮助。
如果我的解决方案不起作用,那么将您的代码简化为您认为应该起作用且不起作用的最基本的东西,然后将其发布在这里。