《JS 函数的执行时机》

102 阅读1分钟

先思考一个问题

问:解释为什么如下代码会打印 6 个 6

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

答:6个6

一、调用的时机不同,结果也不同

1、如何得出6个6

  • setTime的意思是当你把手头的事情忙完之后再打印出i,0就是什么事情都不要等,立马打印出i

  • 把for循环执行完,打印出i

  • for循环在i = 6的时候才会停止,如果i = 5的时候,会进入循环,进行i++操作,得出结果6,然后判断,在不满足中间条件的时候才会跳出循环,就是i = 6的时候才不会满足条件,跳出循环

2、如何得出0,1,2,3,4,5

for(let i = 0;i<6;i++){
  setTimeout(() =>{
    console.log(i)
  },0)
}
  • 每次进入这个循环的时候,把这个i复制一份,第一次循环把i=0复制一份,留在这里,第二次...每次循环会多留一个i

  • 因为它把i复制了六遍

3、还有其他方法吗?

function fn(x){
    if(x<6){
        return x
    }
}

截屏2021-09-15 下午3.01.52.png

总结:

调用时机因为JS的函数,由于变量的值会变,所以每次在求值的时候,都要想一下所有代码的顺序是怎么样的,如果不确定这个调用顺序,那么这个值很可能是以前的或者是错的