作用域
函數參數默認值 實際上形成了一個單獨的作用域,舉個栗子:
let foo = 'outer';
function bar(func = () => foo) {
let foo = 'inner';
console.log(func());
}
bar(); // outer
在bar 中 的函數參數中的 foo 指向的是bar 中的foo,但是bar 中沒有定義foo,所以向上指向的是全局的foo (outer)
如果在bar 中傳入參數 foo, 那麼結果就不一樣了,栗子:
let foo = 'outer';
function bar(foo, func = () => foo) {
var foo = 'inner';
console.log(func());
}
bar(1); // 1
這裏需要注意的是 內層foo 的定義不能用let ,因爲在bar中已經定義了。
(怎麼讓foo 等於內層的foo? 這種問題和我們說的沒什麼太大聯繫了。一個方法是 不要讓2個foo重名就好。)
利用函數默認值的應用
function throwIfMissing() {
throw new Error('Missing parameter');
}
function foo(mustBeProvided = throwIfMissing()) {
return mustBeProvided;
}
foo()
// Error: Missing parameter
需要注意的是,默認值總是在沒有賦值的情況下調用。所以上述栗子如果foo傳值了,那麼 throwIfMissing函數不會運行。