ES6 函數默認值與作用域

作用域

函數參數默認值 實際上形成了一個單獨的作用域,舉個栗子:

    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函數不會運行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章