它可能有助于理解javascript何時執行代碼,以及何時等待執行:
let foo2 = function foo(bar=baz()){ console.log(bar); return bar()}
- javascript執行的第一件事是函數構造函數,并創建一個函數對象。類的函數關鍵字語法。
=>
語法,您將得到類似的(但不完全相同
)結果。 - 然后將剛剛創建的函數分配給變量。
foo2
- 此時,沒有運行任何其他函數:沒有調用其他函數(兩者都沒有)。
baz
也不bar
,沒有價值觀等。但是,在函數中已經檢查了語法。 - 如果你通過
foo
或foo2
到setTimeout
然后在超時之后,它將調用該函數,就像您這樣做一樣。foo()
..(注意,沒有任何arg傳遞給foo
..這是因為setTimeout
在默認情況下不會傳遞參數,雖然它可以
,但這些參數是在超時到期之前計算的,而不是在超時到期時計算的。) - 調用foo后,將計算默認參數。因為我們不傳遞參數就調用foo,所以默認的
bar
被評估。(如果我們通過一個論點,這種情況就不會發生) - 的默認參數計算時,
bar
,第一個javascript查找一個名為baz
..如果它找到了一個函數,那么它就會嘗試調用它作為一個函數。如果該方法有效,則將返回值保存到bar
.
- 現在評估該職能的主體:
- JavaScript查找變量
bar
然后用結果調用sole e.log。這不叫酒吧。但是,如果它被稱為bar()
,然后bar
的返回值。bar()
會被傳遞給console.log
相反。注意,javascript獲取它正在調用的函數的參數值。以前
它調用該函數,甚至在它查找該函數之前,查看它是否存在,是否確實是一個函數。 - JavaScript再次查找
bar
,然后嘗試將其稱為函數。的結果返回值。foo()
因此,函數體和默認參數不是立即調用的,但是其他的都是。類似地,如果執行函數調用(即()
),則該函數也會立即執行。但是,不需要調用函數。去掉括號將允許您傳遞該函數并稍后調用它。但是,這樣做的缺點是不能指定要調用函數的參數。此外,javascript在函數括號內執行所有操作。以前它調用函數或查找存儲在其中的變量。