调用时机是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在for和let一起用的时候会加东西,每次循环会多创建一个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)
}