簡體   English   中英

我應該何時將函數存儲到變量中?

[英]When should I store a function into a variable?

我目前正在學習JavaScript,我不太明白何時將函數寫入變量。

例如,以下兩個代碼塊在Node.js中執行完全相同的操作:

 var onReq = function(req, res) {
   res.write('Hello');
 };

 http.createServer(onReq).listen(3000);

function onReq(req, res) {
   res.write('Hello');
 }

 http.createServer(onReq).listen(3000);



根據最佳實踐,哪種方法最好?為什么?

通常我只會在以后需要重新定義該函數的動作時使用var funcName = function(){} 例如:

var foo = function(a){ return a * 2; }
var bar = foo(2);

foo = function(a){ return a / 2; }

bar = foo(bar);

否則,對於大多數目的(假設它不是回調或修飾符),通常可接受聲明“經典”的函數。

我默認使用非變量function onReq(){}版本。 這不是我做出的一個有說服力的決定,但是考慮它會帶來這些論點:

  • 它看起來更干凈。
  • 它在概念上更簡單:它只是一個函數,而另一個是函數和變量。 這是一件小事,但我發現它很有價值。
  • 它向我保證onReq將始終引用函數體 - 在閱讀代碼時要少考慮一件事。 有點像在Java中將變量標記為final
  • 讓我“不小心”更換功能,在其他地方造成意外的副作用。

這是一個解釋:

函數名稱和函數分配給的變量之間有區別:

  • 無法更改函數名稱,而可以重新分配函數所分配的變量。
  • 函數名稱只能在函數體內使用。 試圖在函數體外部使用它會導致錯誤(如果先前通過var語句聲明了函數名,則會導致錯誤)。

https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope

根據John Resig的JavaScript作為第一語言的文章,您的第一個代碼塊被認為是最佳實踐。

我個人在某些版本的IE(很可能是IE8或更低版本)中使用非變量語法時遇到了調用局部函數(在其他函數內聲明的函數)的某些問題,而變量語法確實按預期工作。

鑒於函數不應該在全局命名空間中被解析,大多數函數都是本地的,因此總是使用函數的變量語法是有意義的。

我在這里看到了一些不同的意見,但其中大多數都更基於你認為更好或不更好的東西,但我沒有看到何時使用其中一個或另一個的技術原因,但肯定有技術限制或優勢使用一個聲明公式或另一個。 我真的是一個javascript的初學者,我不自信地建議它,但我會提出一個案例,其中在變量中存儲函數是不起作用的。

在下面的代碼中,定義一個Angular過濾器,如果我在變量中定義函數,那么我無法從filter方法成功調用它。 誰能解釋一下我的技術原因?

看代碼(評論不起作用):

angular
    .module('loc8rApp')
    .filter('formatDistance', formatDistance);

function formatDistance(){
        return function (distance) {
        var numDistance, unit;
        if (distance && _isNumeric(distance)) {
         if (distance > 1) {
            numDistance = parseFloat(distance).toFixed(1);
            unit = 'km';
          } else {
            numDistance = parseInt(distance * 1000,10);
            unit = 'm';
          }
          return numDistance + unit;
        } else {
          return "?";
        }
      };
};

var _isNumeric = function (n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
};

/*
var formatDistance = function () {
  return function (distance) {
    var numDistance, unit;
    if (distance && _isNumeric(distance)) {
      if (distance > 1) {
        numDistance = parseFloat(distance).toFixed(1);
        unit = 'km';
      } else {
        numDistance = parseInt(distance * 1000,10);
        unit = 'm';
      }
      return numDistance + unit;
    } else {
      return "?";
    }
  };
};
*/

先感謝您!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM