for(var i = 0; i<5; i++){
setTimeout(function(){
console.log(i);
},1000);
}
输出:5 5 5 5 5
若想输出为:0 1 2 3 4
闭包
for(var i=0; i<5; i++){
(function(j){
setTimeout(function(){
console.log(j);
},j*1000);
})(i);
}
函数传参
for(var i=0;i<5;i++){
setTimeout(function(j){
console.log(j);
},i*1000,i);
}
第三个及以后的参数都可以作为setTimeout第一个函数的参数
function sum(x,y,z){
console.log(x+y+z);
}
setTimeout(sum,1000,1,2,3);
输出为6
let
for(let i = 0; i<5; i++){
setTimeout(function(){
console.log(i);
},1000);
}
Promise
如果想要输出0 1 2 3 4 5
const tasks = []; // 这里存放异步操作的 Promise
const output = (i) => new Promise((resolve) => {
setTimeout(() => {
console.log(new Date, i);
resolve();
}, 1000 * i);
});
// 生成全部的异步操作
for (var i = 0; i < 5; i++) {
tasks.push(output(i));
}
// 异步操作完成之后,输出最后的 i
Promise.all(tasks).then(() => {
setTimeout(() => {
console.log(new Date, i);
}, 1000);
});