此函数接受一个参数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);
}
答案 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)
您不需要为此
使用evalsetTimeout(function() { whichImage.width=width; } ,3000);
这是你的功能
function resizeImageFunction(whichImage){
var halfwidth = Math.round(width/2);
whichImage.width=halfwidth;
setTimeout(function() { whichImage.width=width; } ,3000);
}