Why Array doesn't work in console?
本问题已经有最佳答案,请猛点这里访问。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | var animel = new Array(); animel[0] = 'cat'; animel[1] = 'dog'; animel[2] = 'horse'; animel[3] = 'cow'; animel[4] = 'elephant'; animel[5] = 'tiger'; animel[6] = 'lion'; animel[7] = 'fish'; for (var i = 0; animel.length > i; i++) { setTimeout( function () { console.log(animel[i]); }, 2000); } |
当我在控制台中执行此代码时,它会记录
一个非常常见的问题:回调是异步执行的,但使用的是
- 你的循环设置了一些超时
-
循环结束,
i 的值为8 -
触发超时,并执行
console.log(animel[i]) ,其中i 为8
为避免这种情况,您需要断开与
1 2 3 | setTimeout((function (index) { return function () { console.log(animel[index]); } })(i), 2000); |
数组没有问题,问题是如何关闭变量
当函数执行时(循环完成后2秒),
1 2 3 4 5 | for (var i = 0; animel.length > i; i++) { setTimeout(function (i) { console.log(animel[i]); }, 2000, i); } |
如果您需要在IE <9上支持此语法,MDN文章提供了几种polyfill技术。
您需要创建一个闭包来"捕获"
1 2 3 4 5 6 7 8 | var createFunc = function(i){ return function(){ console.log(animel[i]); }; }; for (var i = 0; animel.length > i; i++) { setTimeout(createFunc(i), 2000); } |
这是JS机箱候选者。
1 2 3 4 5 6 7 | for (var i = 0; i<animel.length; i++) { (function(x){ setTimeout(function() { console.log(animel[x]); }, 500); })(i); } |
DEMO
你将它包装在一个setTimeout函数中,这是一个非阻塞操作。当循环完成时,我已经增加到一个破坏循环的值,并且超出了数组的范围。