推送在事件处理程序中时的Javascript拼接

推送在事件处理程序中时的Javascript拼接,javascript,Javascript,假设您有一个如下所示的数组: var arr= [{id:121, v:'a'}, {id:232, 'b'}]; arr.push( {id:443, 'c'} ); 您需要找到id:232并将其删除,以便执行以下操作: for (var i = arr.length; i--;) { if (arr[i].id === 232) { arr.splice(i, 1); } }; 假设有一个事件处理程序正在向数组中添加项,如: var arr= [{id:

假设您有一个如下所示的数组:

var arr= [{id:121, v:'a'}, {id:232, 'b'}];
arr.push( {id:443, 'c'} );   
您需要找到id:232并将其删除,以便执行以下操作:

for (var i = arr.length; i--;) {
   if (arr[i].id  === 232) {
      arr.splice(i, 1);
   }
};
假设有一个事件处理程序正在向数组中添加项,如:

var arr= [{id:121, v:'a'}, {id:232, 'b'}];
arr.push( {id:443, 'c'} );   
是否可能在for循环迭代时调用事件处理程序?如果是这样,那么拼接(i,1)将删除错误的数组索引


由于javascript是单线程的,在处理事件之前完成for循环是否足够智能?

除非for循环实际触发事件,否则它将在处理事件之前完成。变量数组是脚本运行时可用的数组,因此如果在执行过程中触发事件并将其添加到数组中,则在下次脚本运行之前不会发生任何事情。

有趣的问题。我做了一个小测试来检查是否真的有问题。似乎在循环完成后会发生click事件(仅使用Chrome进行测试)

$(文档)。单击(函数(){
console.log('click');
});
$('button')。一个('click',函数click(){
var i=0,b=此;
log('wait…');
而(i++<1E10)1+1;
console.log('done!');
setTimeout(函数(){
$(b).一个('点击',点击);
}, 10);
});

如果有任何问题,请随时告诉我。

这个答案也是正确的。我只允许将一个标记为正确。谢谢你的帮助。@BrianMcGinity没错。最好分成多个操作。您可以使用计时器来模拟多线程,但必须有更好的方法:。