Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
设置超时和";这";在JavaScript中_Javascript - Fatal编程技术网

设置超时和";这";在JavaScript中

设置超时和";这";在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.

我有一个使用该函数并调用另一个方法的方法。在初始荷载下,方法2可以正常工作。但是,在超时之后,我得到一个错误,该错误表示
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);