JavaScript 函數參數的最佳實踐 | CodeUtopia

cchm0236 7年前發布 | 7K 次閱讀 JavaScript開發 JavaScript ECMAScript

常常會有人問一些像“我應該使用對象來傳遞函數參數嗎”這類問題。我確定你知道這種模式,因為這在許多庫中很常見:

$.post({ a: 'lot', of: 'properties', live: 'in', here: 'yep' })`

但是我想說,這實際上不是一個好主意。

讓我們看看再 JavaScript 中定義函數參數列表最佳的實踐。

清晰是目標

把對象當作參數傳遞給函數的問題是你要傳入的值指向不清。

像jQuery這樣的庫,這不是一個大問題——就是看看文檔然后就知道你要怎么做了。但是在自定義代碼中,你會在工作中碰到?看看文檔……啊!等等!哪來的文檔!Yeah。

盡可能多的文檔當然好,自定義代碼庫永遠不會有這種你需要的文檔。如果你需要弄清一些方法需要的參數,你需要深入了解源代碼。

這個問題可以用一個例子來解釋。這里有一個用于控制其他函數之間間隔的函數。

function throttle(o) {
  o.threshhold || (o.threshhold = 250);
  var last,
      deferTimer;
  return function () {
    var context = o.scope || this;

    var now = +new Date,
        args = arguments;
    if (last && now < last + threshhold) {
      // hold on to it
      clearTimeout(deferTimer);
      deferTimer = setTimeout(function () {
        last = now;
        o.fn.apply(context, args);
      }, o.threshhold);
    } else {
      last = now;
      o.fn.apply(context, args);
    }
  };
}

快!你往參數對象中放入了什么值?

沒有瀏覽整個函數的話,你是找不到關于參數的惱人線索的,甚至之后,你可能會出錯。

這里是原始的注釋:

function throttle(fn, threshhold, scope)`

快!函數取了什么參數??

如果你拆解了這個炸彈,然后你需要回答那個問題或者爆炸,并且你只有幾秒鐘的時間思考……我肯定具有獨立的參數會比較好。

好啦,那么第一個最佳嘗試是:給你的函數使用單獨命名的參數

此外,單獨的參數如果在一個函數式編程風格中同樣很有幫助。在FP中一個常見的事是調用函數,如果你的函數使用對象作為參數,那么會非常苦逼。

對于可選項來說對象非常好

單獨的參數是一個很好的開始,那么我們將會在函數有可選參數的時候遇到問題。

對于只有一個可選參數的函數來說,解決方案很簡單:

function stuff(requiredA, requiredB, optional)

最佳實踐:可選項放在最后

然而,如果你有多于一個的可選項,問題……如果我們只傳 個可選參數如何?

function foo(required, optionalA, optionalB) { /* something */ }

foo('hello', undefined, 1337);

啊!需要填充類似于undefined的值,這真的是越來越復雜了——同樣需要調用他們,并且需要在函數中處理這些參數

在多可選參數的情況下,我們可以使用對象。這并沒有真正地解決問題,但是這意味著我們不需要處理額外的值。

foo('hello', { optionalB: 1337 });

最佳實踐:如果有超過一個可選參數時,使用對象

ES6的好處

最后,如果你使用ES6或者TypeScript,我們可以使用一些新的語法。

對于有可選參數的函數,我們并不清楚這個參數是否可選。有了ES6,我們能夠提供一個默認值讓這個變得明顯:

function something(a, b = 'default value') {
  //if b is not passed, its value becomes 'default value'
}

最佳實踐:給可選參數提供默認值

我們可以使用解構參數列表中對象和它的默認值。

function foo(required, { optionalA, optionalB } = { }) {
  //available variables:
  //required, optionalA, optionalB
}

foo('hi', { optionalA: 1, optionalB: 1337 });

這給了你兩全其美的辦法。你可以方便地使用對象作為參數,但是對象的屬性能夠從函數的注釋中看到。

最佳實踐:使用ES6解構重要的地方

總結

對于上述建議的補充,在函數聲明前使用注釋是另一個有用的習慣。這對于讀者來說非常有用,能夠迅速了解大概,不僅僅是函數的參數,還有他們的類型和其他注意點。

總結:

  • 使用單獨的命名參數

  • 把可選參數放在最后

  • 對于多個可選參數適用對象

  • 默認值可以用來表明可選參數

  • 使用解構來說明對象參數

這是另一個你可以用ES6默認參數做的有趣事情。通常情況下,如果你不傳遞一個必要的參數,什么事都不會發生。但是有了默認值,我們可以讓代碼自動拋出一個缺少必要參數的錯誤!David Walsh有一個 對此的極佳總結

 

來自:http://www.zcfy.cc/article/best-practices-for-javascript-function-parameters-codeutopia-2053.html

 

 本文由用戶 cchm0236 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!