函数中的setTimeout失败

时间:2012-03-25 06:02:10

标签: javascript function settimeout

此函数接受一个参数whichImage。这是我们正在使用的图像的HTMLImageElement对象。图像宽度将减半,然后在3秒后,它将恢复到正常宽度。但是,应该在3秒后执行的setTimeout代码失败,并显示未定义whichImage的错误消息。我需要纠正什么才能使这个功能起作用?

function resizeImageFunction(whichImage){
    // Get the width of the image
    alert(whichImage);
    var width = whichImage.width;
    var halfwidth = Math.round(width/2);
    whichImage.width=halfwidth;
    setTimeout("whichImage.width=width;",3000);
}

5 个答案:

答案 0 :(得分:1)

function resizeImageFunction(whichImage){
    // Get the width of the image
    alert(whichImage);
    var width = whichImage.width;
    var halfwidth = Math.round(width/2);
    whichImage.width=halfwidth;

    setTimeout(function(){
        whichImage.width=width;
    },3000);
}

答案 1 :(得分:1)

您的问题的解释如下:

将字符串传递给setTimeout()时,该字符串将由全局范围内的eval()进行评估。因此,您调用的任何函数或您在其中引用的变量必须可从全局范围中获得。这就解释了为什么你不能引用你的函数的局部变量或参数,因为它们都不在全局范围内,所以当eval()试图找到它们时,它看起来在全局范围内并且它们不在那里

使用内联匿名函数将setTimeout()函数更改为此函数时:

setTimeout(function() {
    whichImage.width = width;
}, 3000);

现在你有真正的javascript代码(不是一个字符串),它在不存在eval()的地方进行评估,而且由于你可以完全访问封闭函数的局部变量和参数。允许您访问whichImage(参数)和width(局部变量),以便您的代码正常工作。

这是#14的原因,你应该总是使用真正的javascript函数引用或匿名函数声明,而不是将字符串传递给setTimeout()

答案 2 :(得分:0)

您需要将您的代码块包装在匿名函数中,如:

setTimeout(function () {
    whichImage.width=width;
}, 3000);

答案 3 :(得分:0)

尝试:


setTimeout(function() {
   whichImage.width=width;
},3000);   

答案 4 :(得分:0)

您不需要为此

使用eval
setTimeout(function() { whichImage.width=width; } ,3000);

这是你的功能

function resizeImageFunction(whichImage){
    var halfwidth = Math.round(width/2);
    whichImage.width=halfwidth;
    setTimeout(function() { whichImage.width=width; } ,3000);
}