Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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:推送列表中的项目并延迟打印它们_Javascript_Scope_Settimeout_Delay - Fatal编程技术网

Javascript:推送列表中的项目并延迟打印它们

Javascript:推送列表中的项目并延迟打印它们,javascript,scope,settimeout,delay,Javascript,Scope,Settimeout,Delay,我想使用for循环推送列表中的项目,并延迟打印每个步骤。相反,我在每次迭代中都会得到完整的列表。我想这是一个范围问题,但我想不出解决方案 这是我的密码: function printNumber(num,i){ setTimeout(()=>console.log(num),500*i); } let numbers = [50]; for(let i=1; i<=10; i++){ printNumber(numbers,i); numbers.p

我想使用for循环推送列表中的项目,并延迟打印每个步骤。相反,我在每次迭代中都会得到完整的列表。我想这是一个范围问题,但我想不出解决方案

这是我的密码:

function printNumber(num,i){

    setTimeout(()=>console.log(num),500*i);
}


let numbers = [50];

for(let i=1; i<=10; i++){

    printNumber(numbers,i);
    numbers.push(i);
}


函数printNumber(num,i){
setTimeout(()=>console.log(num),500*i);
}
让数字=[50];

对于(设i=1;i您将移交数组而不是值

printNumber(i, i);
//          ^
函数printNumber(num,i){
setTimeout(()=>console.log(num),500*i);
}
让数字=[50];

对于(让i=1;i我想您可能在下面的代码片段中寻找类似的内容。数组在每次迭代中都包含所有值,因为循环在
setTimeout
开始打印之前运行到完成

由于数组存储为引用,
num
numbers.push(i)
变异

每个循环向函数传递一个新数组将解决此问题

函数printNumber(num,i){
setTimeout(()=>console.log(num),500*i);
}
让数字=[50];
for(设i=1;i这是因为,这意味着在循环结束后长时间运行的回调将全部指向相同的、更新的数组值

要使用中间状态,您需要每次复制数组。您可以通过以下方式调用
printNumber

printNumber([...numbers], i);
这样它就可以创建一个新的数组副本,并且迭代不会相互干扰


*请参阅以获取进一步的说明

setTimeout是一个计时器。它将延迟执行内部的任何内容。它不会暂停其余的代码。到
控制台时,日志
执行您的数组已完成。因此它将打印完成的数组

let number=[50];
对于(设i=1;i{
console.log(编号,i)
数字推送(i);
},500*i);

}
您的解决方案是正确的,但您的链接标题是错误的。JavaScript总是按值传递,而不是引用。事实上,您链接的问题中最重要的答案之一解释了这一点。对象(包括数组)变量中的值是一个引用。因此它仍然传递值,但值是一个引用。其效果几乎相同,只是它意味着在不将其传递给函数的情况下可能发生意外变异。@Brianthonpson更正!编辑了我的答案以引用您的注释(并非双关语)