JavaScript 关于闭包、同步、异步问题

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

  1. 如果想输出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)
  1. 顺序输出数字
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);
})();
原文地址:https://www.cnblogs.com/iFanLiwei/p/13554161.html