Javascript:推送列表中的项目并延迟打印它们
我想使用for循环推送列表中的项目,并延迟打印每个步骤。相反,我在每次迭代中都会得到完整的列表。我想这是一个范围问题,但我想不出解决方案 这是我的密码: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
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更正!编辑了我的答案以引用您的注释(并非双关语)