7. 函數(shù)

2018-02-24 16:11 更新
  • 7.1?使用函數(shù)聲明代替函數(shù)表達式。

    為什么?因為函數(shù)聲明是可命名的,所以他們在調用棧中更容易被識別。此外,函數(shù)聲明會把整個函數(shù)提升(hoisted),而函數(shù)表達式只會把函數(shù)的引用變量名提升。這條規(guī)則使得箭頭函數(shù)可以取代函數(shù)表達式。

      // bad
      const foo = function () {
      };
    
      // good
      function foo() {
      }
  • 7.2?函數(shù)表達式:

    // 立即調用的函數(shù)表達式 (IIFE)
    (() => {
      console.log('Welcome to the Internet. Please follow me.');
    })();
  • 7.3?永遠不要在一個非函數(shù)代碼塊(ifwhile?等)中聲明一個函數(shù),把那個函數(shù)賦給一個變量。瀏覽器允許你這么做,但它們的解析表現(xiàn)不一致。

  • 7.4?注意:?ECMA-262 把?block?定義為一組語句。函數(shù)聲明不是語句。閱讀 ECMA-262 關于這個問題的說明。

    // bad
    if (currentUser) {
      function test() {
        console.log('Nope.');
      }
    }
    
    // good
    let test;
    if (currentUser) {
      test = () => {
        console.log('Yup.');
      };
    }
  • 7.5?永遠不要把參數(shù)命名為?arguments。這將取代原來函數(shù)作用域內的?arguments?對象。

    // bad
    function nope(name, options, arguments) {
      // ...stuff...
    }
    
    // good
    function yup(name, options, args) {
      // ...stuff...
    }
  • 7.6?不要使用?arguments??梢赃x擇 rest 語法?...?替代。

    為什么?使用?...?能明確你要傳入的參數(shù)。另外 rest 參數(shù)是一個真正的數(shù)組,而?arguments是一個類數(shù)組。

      // bad
      function concatenateAll() {
        const args = Array.prototype.slice.call(arguments);
        return args.join('');
      }
    
      // good
      function concatenateAll(...args) {
        return args.join('');
      }
  • 7.7?直接給函數(shù)的參數(shù)指定默認值,不要使用一個變化的函數(shù)參數(shù)。

    // really bad
    function handleThings(opts) {
      // 不!我們不應該改變函數(shù)參數(shù)。
      // 更加糟糕: 如果參數(shù) opts 是 false 的話,它就會被設定為一個對象。
      // 但這樣的寫法會造成一些 Bugs。
      //(譯注:例如當 opts 被賦值為空字符串,opts 仍然會被下一行代碼設定為一個空對象。)
      opts = opts || {};
      // ...
    }
    
    // still bad
    function handleThings(opts) {
      if (opts === void 0) {
        opts = {};
      }
      // ...
    }
    
    // good
    function handleThings(opts = {}) {
      // ...
    }
  • 7.8?直接給函數(shù)參數(shù)賦值時需要避免副作用。

    為什么?因為這樣的寫法讓人感到很困惑。

    var b = 1;
    // bad
    function count(a = b++) {
      console.log(a);
    }
    count();  // 1
    count();  // 2
    count(3); // 3
    count();  // 3
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號