javascript - ES6中函數參數默認值為函數的問題?
問題描述
我對函數參數默認值為函數的情況有許多困惑比如
let foo = ’outer’;function bar(func = x => foo) { let foo = ’inner’; console.log(func()); }bar(); //outer
根據阮一峰的es6入門,我知道函數參數是默認值的話,會先有個塊級作用域包裹參數,初始化結束后塊級作用域消失
一旦設置了參數的默認值,函數進行聲明初始化時,參數會形成一個單獨的作用域(context)。等到初始化結束,這個作用域就會消失。這種語法行為,在不設置參數默認值時,是不會出現的。
如果默認值是普通變量我能理解,但還是不懂為什么這里輸出的是outer而不是inner
問題解答
回答1:一句話:函數的閉包在定義時形成,而非運行時。
回答2:把語法糖徹底展開,應該能看清楚點
let foo = ’outer’;function fk_compiler() { return foo;}function bar(func) { if (func === undefined) { func = fk_compiler; } let foo = ’inner’; console.log(func());}bar();
你看,fk_compiler里是不是只能返回外部作用域下的foo?
回答3:js是詞法作用域,foo值取函數定義時的值而不是執行時的值。
回答4:基于回復者的代碼:
let foo = ’outer’;function fk_compiler() { return foo;}function bar(func) { if (func === undefined) { func = fk_compiler; } let foo = ’inner’; console.log(func());}bar();
js采取的是詞法作用域,所以,無論函數在哪里被調用,或者以任何形式被調用,其詞法作用域只由其被聲明時的位置決定。
fk_compiler被聲明的作用域在全局,所以,它會去訪問全局作用域中的foo。答案也就出來了。
類似代碼:
function foo(){ console.log(this.a);}(function init(){ var a = ’inner’;//此處改為 window.a = ’global’;再試試 foo();})();
相關文章:
1. mysql數據庫做關聯一般用id還是用戶名2. linux運維 - python遠程控制windows如何實現3. thinkPHP5中獲取數據庫數據后默認選中下拉框的值,傳遞到后臺消失不見。有圖有代碼,希望有人幫忙4. python小白 關于類里面的方法獲取變量失敗的問題5. python - 如何對列表中的列表進行頻率統計?6. javascript - 如何用最快的速度C#或Python開發一個桌面應用程序來訪問我的網站?7. Python2中code.co_kwonlyargcount的等效寫法8. django - Python error: [Errno 99] Cannot assign requested address9. python小白,關于函數問題10. 求救一下,用新版的phpstudy,數據庫過段時間會消失是什么情況?
