《JS函数的执行时机》

222 阅读1分钟

调用时机是JS函数的一个很重要的要素,调用时机不同,得到的结果就会不同。

示例1:

let a =1 
functon fn(){
    console.log(a)
}
a = 2
fn()

打印出2,因为a=2后函数fn()才调用。

示例2

let a =1 
functon fn(){
    console.log(a)
}
fn()
a = 2

打印出1,因为先调用函数fn()后赋值a=2。

示例3

let a = 1
function fn=(){
  setTimeout(()=>{
    console.log(a)
  },0)
}

fn()
a=2

打印出2,因为setTimeout()会让函数尽快打印出a的值,即整体先执行完在打印。

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

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

答:因为是for循环先执行完,执行完后i=6,再去打印出6次i,所以结果是6个6.

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

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

原因:因为JS在forlet一起用的时候会加东西,每次循环会多创建一个i

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

  • 闭包
let i 
for(i = 0; i<6; i++){
  !function(x){
      setTimeout(()=>{
        console.log(x)
      },0)
 }(i)
}
  • 利用 const 关键字
let i
for(i = 0; i<6; i++){
    const x = i
    setTimeout(()=>{
      console.log(x)
    })
}
  • 利用setTimeout()的第三参数
let i 
for(i = 0; i<6; i++){
  setTimeout((x)=>{
    console.log(x)
 },0,i)
}