我對函數參數預設值為函數的情況有許多困惑
例如
let foo = 'outer';
function bar(func = x => foo) {
let foo = 'inner';
console.log(func());
}
bar(); //outer
根據阮一峰的es6入門,我知道函數參數是預設值的話,會先有個區塊級作用域包裹參數,初始化結束後區塊級作用域消失
一旦設定了參數的預設值,當函數進行宣告初始化時,參數會形成一個單獨的作用域(context)。等到初始化結束,這個作用域就會消失。這種語法行為,在不設定參數預設值時,是不會出現的。
如果預設值是普通變數我能理解,但還是不懂為什麼這裡輸出的是outer而不是inner
一句話:函數的閉包在定義時形成,而非運行時。
把語法糖徹底展開,應該能看清楚點
你看,
fk_compiler
裡是不是只能回到外部作用域下的foo
?js是詞法作用域,foo值取函數定義時的值而不是執行時的值。
基於回覆者的代碼:
fk_compiler
被聲明的作用域在全局,所以,它會去訪問全局作用域中的foo
。答案也就出來了。類似碼: