for (var i = 0; i < 5; i++){
setTimeout(function(){
console.log(new Date, i)
}, 1000);
}
console.log(new Date, " -> ", i)
同步,异步,变量作用域,闭包。
如果规定用箭头表示前后两次输出之间有1秒的间隔,而逗号表示其前后两次输出之间的间隔可以忽略
5 -> 5,5,5,5,5
- 如果想输出5, 0, 1, 2, 3, 4
// 方法1:JS中基础类型的参数传递是按值传递
var output = function(i) {
setTimeout(function() {
console.log(new Date, i)
}, 1000)
}
for (var i = 0; i < 5; i++){
output(i)
}
console.log(new Date, i)
// 方法2:IFEE声明即执行的函数表达式
for (var i = 0; i < 5; i++) {
(function(j){
setTimeout(function(){
console.log(new Date, j)
}, 1000);
})(i);
}
console.log(new Date, i)
- 顺序输出数字
const tasks = [];
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);
});
//方法2 ES7 async await TODO:失败
const sleep = (timeoutMS) => new Promise((resolve) =>{
setTimeout(resolve, timeoutMS);
})
(async () =>{
for (var i = 0; i < 5; i++) {
await sleep(1000);
console.log(new Date, i);
}
await sleep(1000);
console.log(new Date, i);
})();