【发布时间】:2011-04-05 22:53:08
【问题描述】:
我刚刚开始研究 javascript,所以希望这会很简单。我想制作一个自动播放的图像幻灯片。这非常简单,并且有一些关于它的教程,但由于某种原因我无法让它工作。这就是我所拥有的:
var image1 = new Image();
var image2 = new Image();
var image3 = new Image();
image1.src = "images/website6.jpg";
image2.src = "images/website7.jpg";
image3.src = "images/sunset.jpg";
var images = new Array(
"images/website6.jpg",
"images/website7.jpg",
"images/sunset.jpg"
);
setTimeout("delay(images,0)",2000);
function delay(arr,num){
document.slide.src = arr[num % 3];
var number = num + 1;
setTimeout("delay(arr,number)",1000);
}
我要更改的图像有 id slide。而且我也有一些证据表明它有效。发生的是第一个图像加载。然后加载第二个图像(这意味着原始的 setTimeout 调用必须有效)。然后什么也没有发生。对我来说,这表明递归不起作用。
我对其他语言中的递归非常熟悉,所以我认为它一定只是语法之类的东西,但我似乎无法弄清楚。感谢您的帮助。
【问题讨论】:
-
取消引用第二个 setTimeout 中的参数。这将是我的第一个猜测。
-
@Cronco 有趣的是,如果我这样做,我不会得到第二张图像......这表明这就是让图像改变一次的原因。另外,我看到的每个例子都有引号,这就是我把它们放进去的原因。
-
引用变量的问题在于计时器正在运行完整的字符串
"delay(arr,number)",而不是将变量转换为其存储的值 - 这就是为什么取消引用它会起作用(尽管你仍然需要像这样引用他们...."delay('" + arr + "', '" + number + "')。但是,没有实际意义 - Pointy 的答案更好。我只是在解释发生了什么。 -
此代码不是递归的。
setTimeout注册一个处理程序,以便在函数调用堆栈(存在递归函数的地方)被清除时由事件循环异步调用。
标签: javascript recursion settimeout