什么是函数的执行时机
JS函数在执行的时候,会根据函数所处位置的不同,执行不同的结果
接下来我们通过几个例子,来实际说明一下JS函数的执行时机
实例:
例1
let a = 1
function fn(){
console.log(a)
}
上述代码并不会输出任何东西
因为还没有调用函数fn
例2
let a = 1
function fn(){
console.log(a)
}
fn()
上述代码和例1一样,不过这次调用了函数fn,所以会输出------1
例3
let a = 1
function fn(){
console.log(a)
}
a = 2
fn()
上述代码最终会输出------2
因为函数fn在a = 2之后调用的
例4
let a = 1
function fn(){
console.log(a)
}
fn()
a = 2
上述代码最终会输出-----1
因为函数fn在a = 2之前就调用了
6个6的问题
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
上述代码最终会输出6个6,这是为什么呢?
原因其实很简单:for循环在主线程内,setTimeout是异步方法,在任务队列里面,只有主线程执行完后,任务队列才执行,当for执行结束时候,此时的i值已经是6,所以得到结果是6个6
如何让上述代码打印出0、1、2、3、4、5
方法1
利用for let配合
for(let i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
利用 let会产生块级作用域,每一个栈里面的 setTimeout 的 i 是独立的
方法2
传入setTimeout的第三个参数
let i = 0
for(i = 0; i<6; i++){
setTimeout((j)=>{
console.log(j)
},0,i)
}
方法3
闭包 + 立即执行函数
let i = 0
for(i = 0; i<6; i++){
!function (){
setTimeout((j)=>{
console.log(j)
},0,i)
}()
}
方法4
利用const关键字
let i
for(i = 0; i<6; i++){
const x = i
setTimeout(()=>{
console.log(x)
})
}