JS 函数的执行时机

51 阅读1分钟

一、解释为什么如下代码会打印 6 个 6

let i = 0
for(i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}
  • 首先let声明了i=0
  • 进入for循环,i从0开始判断0是否小于6
  • 0<6则执行代码,延迟打印一次i,并在对i加1,覆盖之前的i=0
  • i从1开始进入第二次判断,一次类推
  • 执行到i=6时i<6不成立停止循环
  • 此时只有一个i=6,之前攒了6次延迟打印i
  • 现在开始执行打印,所以得出结果6个6

二、 写出让上面代码打印 0、1、2、3、4、5 的方法

for(let i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}
  • JS 中 for 和 let 一起用的时候会加东西
  • 每次循环会多创建一个 i
  • 复制当前i的值保存
  • 最终停止循环是有6个i的值
  • 并依次打印

三、除了使用 for let 配合,还有什么其他方法可以打印出 0、1、2、3、4、5

方法一:参考方方老师教学
let array = [0,1,2,3,4,5]

Array.prototype.forEach2 = function(fn){
    for(let i=0; i<this.length;i++){
        fn(this[i],i)
    }
}

array.forEach2.call(array,(item)=>console.log(item))
方法二:参考Google
var out = (i) => {
    setTimeout (() => console.log(i),0)
}

for (var i=0; i<6; i++){
    out(i)
}