array.forEach 接受一个回调函数,这意味着它已经创建了一个新的函数范围,并且由于 setTimeout 的性质是非阻塞的,它立即返回,您只需要在每次迭代时增加回调函数执行的延迟:
var ary = ['kevin', 'mike', 'sally'];
ary.forEach(function(person, index){
setTimeout(function(){
console.log(person);
}, 5000 * (index + 1));
})
如果你想用 for 循环达到同样的效果,你可以使用 IIFE 或 let 关键字
IIFE 示例:
var ary = ['kevin', 'mike', 'sally'];
for(var i = 1; i <= ary.length; i++){
(function(i){
setTimeout(function(){
console.log(ary[i - 1]);
}, 5000 * i);
})(i)
}
let 关键字示例:[ECMAScript 6]
var ary = ['kevin', 'mike', 'sally'];
for(let i = 1; i <= ary.length; i++){
setTimeout(function(){
console.log(ary[i - 1]);
}, 5000 * i);
}