将数组作为参数传递给SetTimeout回调

时间:2011-12-07 19:59:22

标签: javascript arrays scope settimeout

我现在已经尝试了两天将数组传递给setTimeout回调。

我一直在寻找互联网,我已经阅读了10个不同的StackOverflow问题及其所有答案。我必须遗漏一些东西,因为在尝试了所有这些不同的东西后,它仍然无效。这就是我现在所处的位置:

function testing(pixels){    

        return function(){
          for(i=0; i<pixels.length;i++){
                a = pixels[i][0];
                b = pixels[i][1];
                c = pixels[i][2];
                d = pixels[i][3];
                box = pixels[i][5];
                done = pixels[i][6];


                color_to_draw = done ? box.color:active_color;
                ctx.fillRect(a,b,c,d);        
                ctx2.clearRect(box.x-1,box.y-1,box.w,box.h);
                draw_colored_box(box.x, box.y, box.w, box.h, color_to_draw, box.alpha, true, ctx2);
            }
        };

}

function ias(pixel_batch){
  var color_to_draw; 
    ctx.fillStyle = "#000000";
    var a, b, c, d, e, box, done, i;


        setTimeout(testing(pixel_batch),pixel_batch[0][4]);
}

我已经找到了所有不同的解决方案,我发现我的方法应该工作。我显然做错了,因为它不起作用。

问题在于,在函数ias()中,pixel_batch.length等于3,或者即使在函数testing(),{{1是正确的值,但在函数RETURNED中通过测试,pixels.length`等于0 ......

最初,这是我尝试过的:

pixels.length

相信它不需要通过外部定义的函数来完成,但此时我已经开始尝试任何事情。

如何将pixel_batch(传递给function ias(pixel_batch){ var color_to_draw; ctx.fillStyle = "#000000"; var a, b, c, d, e, box, done, i; setTimeout((function(pixels){ console.log(pixels.length); return function(){ for(i=0; i<pixels.length;i++){ a = pixels[i][0]; b = pixels[i][1]; c = pixels[i][2]; d = pixels[i][3]; box = pixels[i][5]; done = pixels[i][6]; color_to_draw = done ? box.color:active_color; ctx.fillRect(a,b,c,d); ctx2.clearRect(box.x-1,box.y-1,box.w,box.h); draw_colored_box(box.x, box.y, box.w, box.h, color_to_draw, box.alpha, true, ctx2); } }; })(pixel_batch),pixel_batch[0][4]); } 的参数)转换为setTimeout的回调?

[EDIT / UPDATE] 以下是实际调用ias()的代码:

ias()

[2编辑/更新2]

我希望我能接受你所有的答案,因为你在技术上都是正确的。没有给你正确的信息,这是我的错。我投票给所有人,因为你们都应该得到答案,你们无法用所提供的信息把它给我。

4 个答案:

答案 0 :(得分:2)

这是一篇很好的文章,解释了如何执行此操作:https://gullan.org.uk/passing-parameters-function-settimeout

以下是结论:setTimeout(function(){myFunction(parameter)}, myTimeout);

答案 1 :(得分:2)

你的问题就在这里:

ias(the_pixel_batch);
the_pixel_batch.length = 0;

您在setTimeout运行之前清除阵列。


你应该这样做:

pixel_batch.length = 0;

...在setTimeout回调中。

function ias(pixel_batch) {
    ctx.fillStyle = "#000000";

    setTimeout(function () {
        var color_to_draw, a, b, c, d, e, box, done, i;

        for (i = 0; i < pixels.length; i++) {
            a = pixels[i][0];
            b = pixels[i][1];
            c = pixels[i][2];
            d = pixels[i][3];
            box = pixels[i][5];
            done = pixels[i][6];

            color_to_draw = done ? box.color : active_color;
            ctx.fillRect(a, b, c, d);
            ctx2.clearRect(box.x - 1, box.y - 1, box.w, box.h);
            draw_colored_box(box.x, box.y, box.w, box.h, color_to_draw, box.alpha, true, ctx2);
        }
        pixel_batch.length = 0; // <<--- RIGHT HERE
    }, pixel_batch[0][4]);
}

答案 2 :(得分:1)

扩展大卫的回答:我认为你可能想要的是这样的:

function draw () {
      for(i=0; i<pixels.length;i++){
            a = pixels[i][0];
            b = pixels[i][1];
            c = pixels[i][2];
            d = pixels[i][3];
            box = pixels[i][5];
            done = pixels[i][6];


            color_to_draw = done ? box.color:active_color;
            ctx.fillRect(a,b,c,d);        
            ctx2.clearRect(box.x-1,box.y-1,box.w,box.h);
            draw_colored_box(box.x, box.y, box.w, box.h, color_to_draw, box.alpha, true, ctx2);
        }
    }

function ias(pixel_batch){
  var color_to_draw; 
    ctx.fillStyle = "#000000";
    var a, b, c, d, e, box, done, i;
    setTimeout(function () {draw(pixel_batch)},pixel_batch[0][4]);
}

不需要返回函数的函数,只需使用闭包来直接调用函数。

答案 3 :(得分:1)

是否在调用pixel_batch之后修改ias()数组,而执行超时之前修改?如果是这样,您可以传递数组的副本:

setTimeout(testing(pixel_batch.slice(0)),pixel_batch[0][4]);

(注意.slice()只制作数组的一级深层副本...)