Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将数组作为参数传递到SetTimeout回调_Javascript_Arrays_Scope_Settimeout - Fatal编程技术网

Javascript 将数组作为参数传递到SetTimeout回调

Javascript 将数组作为参数传递到SetTimeout回调,javascript,arrays,scope,settimeout,Javascript,Arrays,Scope,Settimeout,我已经尝试了两天将数组传递到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

我已经尝试了两天将数组传递到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]);
}
我在互联网上到处寻找,我读过10个不同的问题和他们的答案。我一定错过了什么,因为在尝试了所有这些不同的东西之后,它仍然不起作用。这就是我现在的立场:

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]);
}
正如我所相信的,它不需要通过外部定义的函数来完成,但在这一点上,我已经开始尝试任何事情

如何将pixel_batch(传递给
ias()
)的参数)放入setTimeout的回调中

[编辑/更新] 下面是实际调用
ias()
的代码:

函数重画方框(){
//这个循环只是在上一个集合的顶部再次绘制活动框。
//此时,根本不需要清除画布。
VarI;VarI2;VarBox;
var temp_pixelation_array=pixelation_array.slice(0);
变量x_mod;变量y_mod;
var随机数组密钥;
var max_运行;
var_pixel_batch=[];
var num_pixels_/_批=3;
var speed_to_pixelate=3;
var-done;
var-testimer=0;
var定时器=[];

对于(i=0;i,这里有一篇很好的文章解释如何做到这一点:


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

这是一篇很好的文章,解释了如何做到这一点:


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

扩展David的答案:我想你可能想要的是这样的:

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]);
}
函数绘图(){

对于(i=0;i扩展David的答案:我想你可能想要的是这样的东西:

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]);
}
函数绘图(){

对于(i=0;i您的问题就在这里:

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]);
}
函数ias(像素批处理){
ctx.fillStyle=“#000000”;
setTimeout(函数(){
var color_to_draw,a、b、c、d、e、box、done、i;
对于(i=0;ipixel_batch.length=0;//您的问题就在这里:

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]);
}
函数ias(像素批处理){
ctx.fillStyle=“#000000”;
setTimeout(函数(){
var color_to_draw,a、b、c、d、e、box、done、i;
对于(i=0;ipixel_batch.length=0;//是否在调用
ias()
后但在超时执行之前修改
pixel_batch
数组?如果是,可以传递数组的副本:

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

(请注意,仅制作阵列的一级深度副本…

是否在调用
ias()
后但在超时执行之前修改
pixel\u批处理
阵列?如果是,可以传递阵列的副本:

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

(注意,仅创建阵列的一级深度副本…)

乍一看,您的方法似乎很合理,至少我认为我们需要查看一些数据才能进行测试。我真的不明白您为什么要调用一个首先返回函数的函数。在
ias
中只有一个
setTimeout
被调用,因此回调具有对va值的独占访问权函数调用的变量。将函数分解为基本部分,它似乎可以工作:我只使用返回函数的函数,因为我一直在尝试所有操作。最初我只是在setTimeout@JonathonG:此函数是否有遗漏?或是否有其他代码有遗漏访问
像素
数组,可以在
设置超时
发生之前将其清除。这里缺少一些东西。乍一看,您的方法似乎是合理的,至少我认为我们需要查看一些数据以便进行测试。我真的不明白为什么您要调用一个首先返回函数的函数。在
ias
中只调用了一个
setTimeout
,因此回调函数对该函数调用的变量值具有独占访问权。将函数分解为基本部分,它似乎可以工作:我只使用返回函数的函数,因为我被驱使尝试所有操作。最初我刚刚在setTimeout@JonathonG:此函数是否有遗漏?或者是否有任何其他代码可以访问
像素
数组,以便在
设置超时
发生之前将其清除。此处缺少某些内容。我尝试了此操作,但无效。由于某些原因,传入的数组till的长度为0当我尝试在回调函数中访问它时,我认为代码正在调用testing()返回的函数,因此直接在setTimeout中调用testing(…)(而不是