js函式的執行時機和函式被呼叫的時機有關,函式被呼叫時才會被執行,呼叫時機不同,函式的執行結果也不同。
先通過幾個例子來理解這句話:
例一:
let a = 1
function fn()
結果:a不會被列印,因為沒有呼叫函式,函式未被執行。
例二:
let a = 1
function fn()
fn()
// 1
結果:此時會列印出1,首先前面宣告了a=1,然後呼叫fn(),即列印出1。
例三:
let a = 1
function fn()
a = 2
fn()
結果:a被列印為2, 可以通過函式宣告的位置確認,函式裡的變數a是離函式最近的let宣告的變數a,但在函式被呼叫前a被賦值為2。
例四:
let a = 1
function fn()
fn()
a = 2
// 1
結果:a被列印為1, 可以通過函式宣告的位置確認,函式裡的變數a是離函式最近的let宣告的變數a,並且在函式呼叫前a的值未被改變。
例五:
let a = 1
function fn(),0)
}fn()
a = 2
// 2
這裡新增了settimeout函式,這個函式會放在非同步佇列中執行(也就是同步任務執行完畢後才會執行非同步任務),在這道題裡面就是會先執行a=2,然後在執行settimeout,因此列印列印結果為2。
例六:
let i = 0
for(i = 0; i<6; i++),0)
}//不是 0、1、2、3、4、5
//而是 6 個 6
for迴圈在主線程內,settimeout是非同步方法,在任務佇列裡面,只有主線程執行完後,任務佇列才執行,當for執行結束時候,此時的i值已經是6,所以得到結果是個6。
如何列印出0,1,2,3,4,5呢?
方法一:
for(let i = 0; i<6; i++),0)
}// 0、1、2、3、4、5
和例6相比,使用let在for迴圈語句的圓括號之內宣告賦值,在圓括號之間會有乙個隱藏的作用域,並且在每次執行迴圈體之前,js 引擎會把 i 在迴圈體的上下文中重新宣告及初始化一次。
參考:
方應杭:我用了兩個月的時間才理解 letzhuanlan.zhihu.com
方法二:
for (var i = 0; i <6;i++))
}(i)
}
使用立即執行函式在for迴圈體內宣告乙個區域性變數,然後立即執行,也可以像let一樣每次迴圈都得到不同的i。 js 中斷函式執行 js如何中斷遞迴函式
如題,功能是為了生成乙個多級陣列內的某個id及他的父元素的id陣列,但是在查詢完畢以後retrun出生成的陣列結果,依然還執行了剩下的迴圈,請問要如何中斷並跳出呢 initarr id,type list arr const getclassify list,id else else if end ...
js 中斷函式執行 js如何中斷遞迴函式
如題,功能是為了生成乙個多級陣列內的某個id及他的父元素的id陣列,但是在查詢完畢以後retrun出生成的陣列結果,依然還執行了剩下的迴圈,請問要如何中斷並跳出呢 initarr id,type list arr const getclassify list,id else else if end ...
js立即執行函式 JS 函式的執行時機
首先我們介紹一下window.settimeout這個方法,該方法設定乙個定時器,該定時器在定時器到期後執行乙個函式或指定的一段 其語法如下 settimeoutfunction是在到期時間 delay毫秒 之後執行的函式。delay是延遲的毫秒數 一秒等於1000毫秒 函式的呼叫會在該延遲之後發生...