调用时机对于JavaScript函数来说是非常重要的,因为调用的时机不同,函数的结果就会不同(这里调用和执行是同一个意思)
fn 和 fn( )
例:请问下面的函数 fn 会打印出什么内容?
let a = 1
function fn(){
console.log(a)
}
//函数fn根本不会打印出任何内容,因为还没有执行函数
let a = 1
function fn(){
console.log(a)
}
fn()
//这样通过加了()来调用函数,fn才会把a的值1给打印出来
执行时机不同,结果不同
例:请问下面的函数 fn 会打印出什么内容?
let a = 1
function fn(){
console.log(a)
}
a = 2
fn()
//会打印出2,因为函数在调用的时候才会生效,在fn()调用之前,a的值已经给赋成2了,所以会打印出2
let a = 1
function fn(){
console.log(a)
}
fn()
a = 2
//打印出1
setTimeout改变执行时机
setTimeout的意思是“尽快执行”,意思就是你先把手头上的工作搞定,再来做这件事。就比如你有个重要的工作快要搞定了,这时你的领导让你去做另一件事,你会说“马上”“尽快”,然后把手上的工作先完成再去做领导交代的事情。
setTimeout对函数的影响
let a = 1
function fn(){
setTimeout(()=>{
console.log(a)
},0)
}
fn()
a = 2
//打印2
/*
为什么fn()明明先在 a = 2 之前先调用了却还是没有打印1呢?
这里是因为setTimeout对函数的影响:
console.log()函数在setTimeout里面,不会立刻执行,而是等所有代码读完了再执行,即使setTimeout的时间参数写的是0
等所有代码读完了,a的值已经是2了,所以打印2而不是1。
*/
setTimeout对for循环的影响
let i = 0
for(i = 0;i<6;i++){
setTimeout(()=>{
console.log(i)
},0)
}
//打印结果不是0,1,2,3,4,5,而是6,6,6,6,6,6
/*
还是因为setTimeout的影响:
i是在for循环外面就已经声明了,for循环遇到setTimout就会先把for循环完成,然后再执行setTimeout里的console.log(),
而for循环执行完了以后,i的值已经是6了,所以输出6次,结果就是6个6
*/
for(let i = 0;i<6;i++){
setTimeout(()=>{
console.log(i)
},0)
}
//打印出0,1,2,3,4,5
/*
当把let放在for里面时,每次执行JS引擎都会自动往里面多复制一个i。
其实这是JS为了迎合新人的想法故意设计成这样的。
*/