JS 函数的执行时机

141 阅读1分钟
let i = 0
for(i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}

执行的时候以为会打印出0~5

结果却是6个6,因为setTimeout会延迟执行console.log,循环都结束了才会打印,i已经循环到6不满足条件退出循环了,结果就会打印出6个6。

那么如果想打印出0~5,只需要修改2处地方

for(let i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}

把初始化语句let放到循环里后,每次循环都会把i复制一份,留在这个空间,包括初始化的0,i一共有7个值。

在调用函数的时候,不同的时机值也不一样,所有,要想求得想要的值,把握好时机是必不可少的

除了使用 for let 配合,利用闭包也能实现0~5的打印

for(i=0;i<6;i++){
(function(i){
setTimeout(()=>{
console.log(i)
},0)
})(i)
}

因为函数里面寻找变量的作用域链