使用超时和传递变量循环函数

时间:2014-01-23 01:17:37

标签: javascript

好吧我觉得这很简单,我忽视了一些事情。

我有一个数据数组,我正在传递给包含300行的函数。 函数本身挑选一个随机框进行更新,然后传递一个随机数组元素(0-299),然后更新该框。

第一次迭代很好。第二个返回“Uncaught ReferenceError:rand_ad is not defined”

function loop(last_ad, last_ad_box, ads_array){

        // start
        while(rand_ad == last_ad){
               var rand_ad = get_rand(299);
        }
        while(rand_ad_box == last_ad_box){
               var rand_ad_box = get_rand(29);
        }

        console.log(ads_array[rand_ad]);
        // update the ad
        // update_ad('.addno-'+rand_ad_box, ads_array[rand_ad]);

        //recall itself to continue looping after 1 second
        t = setTimeout("loop(rand_ad, rand_ad_box, ads_array)",3000);
    }
    function get_rand(max){
        var rand = Math.floor(Math.random()*max) + 1;   
        return rand;
    }

我认为它可能是函数循环周围的引号,它将内部变量视为字符串而不是实际变量,但我不能在它触发错误之前将其渲染出来。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

你的猜测是正确的。将超时行更改为:

t = setTimeout(loop, 3000, rand_ad, rand_ad_box, ads_array);

将字符串传递给setTimeout是一种安全风险,不建议这样做。此外,它在超时发生之前不执行代码,因此在函数退出后将取消引用变量。

如果你需要它在IE中工作,那么你将不得不使用它:

t = setTimeout(function () {
    loop(rand_ad, rand_ad_box, ads_array);
}, 3000);