js函数的执行时机

214 阅读1分钟
  • 例子一
   let a = 1
   function fn(){
    console.log(a)
   }
   // 不会打印任何东西,因为函数没有执行
  • 例子2
let a = 1
function fn(){
    console.log(a)
}
fn() // 1 
//一开始声明了 a , a 的值为1,然后调用函数 fn , 打印 a。 
  • 例子3
let a = 1
function fn(){
    console.log(a)
}
fn() // 1
a = 2
// 这次是在函数执行后改变 a 的值,函数执行的时候,a 的值依旧为1.
  • 通过上面的例子可以得出,函数中某个变量值的判断需要确定函数执行的时机。一开始声明的时候可能是某个值,但函数执行的时候该值可能已经改变了。

  • 异步例子

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

打印出6个6的原因?

  • 由于setTimeout函数的作用,循环执行一次,setTimeout函数的fn会在TodoList后排队等待执行。当for循环结束后,有6个事件排在上面,但每个事件中打印的i都是同一个,在for循环外面定义过的i。而循环执行结束后i的值为6,所以打印出了6个6。

如果想要打印出“0 1 2 3 4 5”?

for(let i = 0;i<6;i++){
    setTimeout(()=>{
        console.log(i)
    },0)
}
/*此处let和for联合使用,每执行一次for循环,js就会在内存中新创建一个i,i的值的变换不会相互影响。因此在TodoList中排队的6个事件中的i值相互独立,所以打印出了不同的值。*/
  • 或者
let i = 0
for(i = 0;i<6;i++){
    console.log(i)
}//0 1 2 3 4 5
/*或者*/
for (var i = 0; i < 6; i++) {
   setTimeout((function(i){
       return function() {
           console.log(i);
       }
   }(i)),0)
}//0 1 2 3 4 5;在i还没有变化的时候立即执行该函数。