设置超时和";这";在JavaScript中
我有一个使用该函数并调用另一个方法的方法。在初始荷载下,方法2可以正常工作。但是,在超时之后,我得到一个错误,该错误表示设置超时和";这";在JavaScript中,javascript,Javascript,我有一个使用该函数并调用另一个方法的方法。在初始荷载下,方法2可以正常工作。但是,在超时之后,我得到一个错误,该错误表示method2未定义。我做错了什么 例: test.prototype.method=function() { //method2根据传递的id返回图像 this.method2('useSomeElement').src=”http://www.some.url"; timeDelay=window.setTimeout(this.method,5000); }; test.
method2
未定义。我做错了什么
例:
test.prototype.method=function()
{
//method2根据传递的id返回图像
this.method2('useSomeElement').src=”http://www.some.url";
timeDelay=window.setTimeout(this.method,5000);
};
test.prototype.method2=函数(名称){
对于(var i=0;i1){
返回文件。图像[i];
}
}
};
您在设置超时中使用的此
通过自身进行范围界定。创建一个var\u this=this在测试.prototype.method中使用函数,并使用\u这个。问题在于设置超时()
导致javascript使用全局范围。本质上,您是在调用方法()
类,而不是从这个
调用。相反,您只是告诉setTimeout
使用函数方法
,没有特定范围
要解决此问题,可以将函数调用包装到另一个引用正确变量的函数调用中。它看起来像这样:
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()
在方法的范围内
当您需要将参数传递给setTimeout
方法时,这个问题会变得更加复杂,因为IE不支持两个以上的setTimeout
参数。那样的话,你需要仔细阅读
另外,作为旁注,您正在为自己设置一个无限循环,因为method()
总是调用method()
我得到一个错误,说method2未定义
是的,当您将此.method
从其所有者处切掉并将函数单独传递给setTimeout
时,您将丢失设置此
的关联,因此方法()
中的此
等于全局对象窗口
有关此
在JavaScript中实际工作的惊人方式的解释,请参阅。一个更优雅的选项是在函数末尾附加.bind(this)
。例如:
setTimeout(function() {
this.foo();
}.bind(this), 1000);
// ^^^^^^^^^^^ <- fix context
setTimeout(函数(){
this.foo();
}.绑定(本),1000);
//^^^^^^^^在es6中,您可以这样做
window.setTimeout(() => {
this.foo();
}, 1000);
只是为了确定:“finction”只是问题中的一个输入错误,还是您的代码中也有?请添加method2test.prototype.method2=function(name){for(var i=0;i1{return document.images[i];};希望这有助于Hanks crescentfresh,对不起,我不打算删除,javascript中的“不是”这在这里解释嘿,这在mozilla bu中有效,而不是在ie中!有线索吗?此外,图像不会循环,在到达最后一个图像时停止。这是一篇关于闭包的优秀文章,在链接中提供了实际示例!谢谢“通过自身确定范围”是什么意思?
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.bind(this), 5000);
// ^^^^^^^^^^^ <- fix context
};
window.setTimeout(() => {
this.foo();
}, 1000);