我有一个使用该setTimeout函数并调用另一个方法的方法。在初始加载时,方法2可以正常工作。但是,超时后,我得到一个错误,它method2是未定义的。我在这里做错了什么?
setTimeout
method2
例如:
test.prototype.method = function() { //method2 returns image based on the id passed this.method2('useSomeElement').src = "http://www.some.url"; timeDelay = window.setTimeout(this.method, 5000); }; test.prototype.method2 = function(name) { for (var i = 0; i < document.images.length; i++) { if (document.images[i].id.indexOf(name) > 1) { return document.images[i]; } } };
问题是setTimeout()导致javascript使用全局范围。本质上,您是在调用method()类,而不是从中调用this。相反,您只是在告诉setTimeout您使用method没有特定作用域的函数。
setTimeout()
method()
this
method
要解决此问题,您可以将函数调用包装在另一个引用正确变量的函数调用中。它看起来像这样:
test.protoype.method = function() { var that = this; //method2 returns image based on the id passed this.method2('useSomeElement').src = "http://www.some.url"; var callMethod = function() { that.method(); } timeDelay = window.setTimeout(callMethod, 5000); };
that可能是this因为callMethod()在方法的范围内。
that
callMethod()
当您需要将参数传递给setTimeout方法时,此问题会变得更加复杂,因为IE不支持向传递两个以上的参数setTimeout。在这种情况下,您需要阅读闭包。
另外,作为旁注,由于method()总是调用,因此您将自己设置为无限循环method()。