不同时机执行JS函数对结果的影响。
JS 函数的执行时机对 JS 函数执行的结果影响很大。
调用时机:时机不同,结果就不同
举例说明各种情况
一:函数未执行
let a = 1
function fn(){
console.log(a)
}
// 不打印任何东西,因为函数没有执行
二:函数执行时机先后的影响
- 开始声明了变量
a, 变量a的值为1,然后调用函数fn, 打印a.
let a = 1
function fn(){
console.log(a)
}
fn() // 1
- 一开始声明了
a,a的值为1,然后在函数之前将2赋值给a. 所以打印出a的值为2.
let a = 1
function fn(){
console.log(a)
}
a = 2
fn() // 2
- 函数执行后改变
a的值,函数执行的时候,a的值依旧为1.
let a = 1
function fn(){
console.log(a)
}
fn() // 1
a = 2
所以我们可以看出,函数中某个变量值的判断,需要确定函数执行的时机。一开始声明的时候可能是某个值,但在函数执行的时候这个值可能已经改变了。
setTimeout函数
输出结果为2。setTimeout这个函数会等一会在执行,即任务执行完后在执行setTimeout,因此打印打印结果为2。
let a = 1
function fn(){
setTimeout(()=>{
console.log(a)
},0)
}
fn() // 2
a = 2
- 打印出
6个6。 因为 i 是全局变量。for 循环执行完毕之后 i 的值为6。是的i =6 。因为 i = 5 满足条件(<6)是最后一轮循环,然后i++,所以 i 为6。这个循环自始至终都是在改变一个 i 的值。所以会打印6个6。
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
三:如何打印出 0,1,2,3,4,5,6
for循环配合let将i定义到for循环体中,i在for循环中每次运行的结果都会被储存,相当于有6个i。因此for循环运行下来结果为0,1,2,3,4,5,而setTimeout会等着for循环结束之后再进行打印,打印的结果为0,1,2,3,4,5。
for(let i = 0;i<6;i++){
setTimeout(()=>{
console.log(i)
},0)
}
- 闭包
let i = 0
for(i = 0; i<6; i++){
!function(j){
setTimeout(()=>{
console.log(j)
},0)
}(i)
}
setTimeout的第三个参数,将i传进去
let i = 0
for(i = 0; i<6; i++){
setTimeout((value)=>{
console.log(value)
},0,i)
}
const关键字
let i = 0
for(i = 0; i<6; i++){
const x = i
setTimeout(()=>{
console.log(x)
})
}