JS函数在不同的时候运行,会有不同的运行结果
同步任务:
上一件事情没有完成,继续处理上一件事情,只有上一件事情完成了,才会做下一件事情
JS中大部分都是同步编程
案例一
let a = 1
function fn(){
console.log(a)
}
//a不存在,因为fn没执行
这里不会打印任何东西,因为函数只是声明了,但是没有执行
案例二
let a = 1
function fn(){
console.log(a)
}
fn() // 1
这里会打印a, 因为一开始声明了 a , a 的值为1,然后调用函数 fn , 打印 a。
异步任务:
计划要做一件事情,但是不是当前立马去执行这件事情,需要等一定的时间,这样的话,我们不会等着他执行,而是继续执行下面的操作。
案例一
let a = 1
function fn() {
setTimeout(()=>{
console.log(a)
},0)
}
fn() //js会先执行当前代码(先执行a=2),然后再做等会再做的事情(然后执行setTimeout
a = 2
setTimeout会等到当前代码执行完毕后,再执行,即执行完let a= 1, fn(), a=2之后,再执行console.log(a)
所以打印出来a是2
案例二
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
当for循环每执行一次时,setTimeout都会执行一次,setTimeout等到当前代码的for循环执行完了,然后再去执行console.log(i)
而for循环执行完之后,i已经是6了
案例三
for(let i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
在for循环i的中加上let。会产生一个隐藏的作用域。在每次执行for循环时,JS会保留i的初始值,然后重新声明执行一次。相当于
(let i = 0) {
setTimeout(()=>{
console.log(i)
},0)
}
(let i = 1) {
setTimeout(()=>{
console.log(i)
},0)
}
(let i = 2) {
setTimeout(()=>{
console.log(i)
},0)
}
(let i = 3) {
setTimeout(()=>{
console.log(i)
},0)
}
(let i = 4) {
setTimeout(()=>{
console.log(i)
},0)
}
(let i = 5) {
setTimeout(()=>{
console.log(i)
},0)
};
关于setitmeout的通俗理解
打游戏,马上推掉敌方水晶了,这时候有人叫你过去,你嘴上说马上(对应setTimeout(function, 0)),但其实会把游戏打完之后再去。
案例四
for(var i = 0;i<6;i++){
!function(i){
setTimeout(()=>{
console.log(i)
},0)
}(i)
}
var 不配合setTimeout