如何在javascript函数的递归调用中访问相同的变量?

时间:2011-01-11 09:48:20

标签: javascript


function onload_animate(id_name, img_src1, img_src2, time_ms){
                document.getElementById(id_name).src = img_src1;
                setTimeout("onload_animate(id_name, img_src1, img_src2, time_ms)", time_ms);
                document.getElementById(id_name).src = img_src2;

        }

这是我给出的代码。我想在每次递归调用中从setTimeout()中的onload_animate(param1,param2,...)访问相同的参数值。怎么可能?

3 个答案:

答案 0 :(得分:3)

如果将settimeout回调放入匿名函数中,它应该可以正常工作。这样参数就在范围内。

function onload_animate(id_name, img_src1, img_src2, time_ms){
                document.getElementById(id_name).src = img_src1;
                setTimeout(
                    function(){
                         onload_animate(id_name, img_src1, img_src2, time_ms);
                    }, time_ms);
                document.getElementById(id_name).src = img_src2;

        }

尝试阅读javascript closures,它们非常有用。

答案 1 :(得分:1)

传递setTimeout一个字符串被认为是不好的做法。这类似于使用eval(),这在JavaScript中是邪恶的。

function onload_animate(id_name, img_src1, img_src2, time_ms){
    document.getElementById(id_name).src = img_src1;

    setTimeout(function () {
        onload_animate(id_name, img_src1, img_src2, time_ms);
    }, time_ms);

    document.getElementById(id_name).src = img_src2;
};

将捕获变量,使其在setTimeout内可用。请注意,此功能目前将永远循环;你需要某种形式的退出(通常检查条件;例如time_ms已经过期了吗?)

您的代码应该看起来像这样;

function onload_animate(id_name, img_src1, img_src2, time_ms) {
    document.getElementById(id_name).src = img_src1;

    setTimeout(function () {
        onload_animate(id_name, img_src2, img_src1, time_ms);
    }, time_ms);
};

有关工作示例,请参阅此代码段:http://www.jsfiddle.net/3vKnW/

JavaScript不等待setTimeout完成。它是异步的。 JavaScript会点击setTimeout行,计划在time_ms时间内运行该函数,但会返回并继续执行它停止的位置。

答案 2 :(得分:0)

使用setInterval不是更好吗?

var int=self.setInterval("onload_animate()",time_ms);