我应该何时将函数存储到变量中?

时间:2012-03-08 13:36:56

标签: javascript node.js

我目前正在学习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);


根据最佳实践,哪种方法最好?为什么?

7 个答案:

答案 0 :(得分:21)

通常我只会在以后需要重新定义该功能的动作时使用var funcName = function(){}。例如:

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

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

bar = foo(bar);

否则,在大多数情况下(假设它不是回调或修饰符)通常可以接受“经典”声明一个函数。

答案 1 :(得分:11)

我默认使用非变量function onReq(){}版本。这不是我做出的一个有说服力的决定,但是考虑它会产生这些论点:

  • 看起来更干净。
  • 概念上更简单:它只是一个函数,而另一个是函数和变量。这是一件小事,但我发现它很有价值。
  • 它向我保证onReq将始终引用那个函数体 - 在阅读代码时要少考虑一件事。类似于在Java中将变量标记为final
  • 让我“意外”更换功能,在其他地方造成意外的副作用。

答案 2 :(得分:3)

这是一个解释:

函数名称和函数分配给的变量之间存在区别:

  • 无法更改函数名称,而可以重新分配函数所赋予的变量。
  • 函数名称只能在函数体内使用。试图在函数体外部使用它会导致错误(如果先前通过var语句声明了函数名,则会导致错误)。

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

答案 3 :(得分:1)

根据John Resig的JavaScript as a First Language文章,您的第一个代码块被视为最佳做法。

答案 4 :(得分:1)

在IE的某些版本(很可能是IE8或更低版本)中使用非变量语法时,我个人遇到了调用局部函数(在其他函数中声明的函数)的某些问题,而变量语法确实按预期工作。

鉴于函数不应该在全局命名空间中被解析,大多数函数都是本地的,因此总是使用函数的变量语法是有意义的。

答案 5 :(得分:0)

我在这里看到了一些不同的意见,但大多数意见更多的是基于你认为好或不好的东西,但我不知道何时使用其中一个或另一个的技术原因,但肯定有使用一种声明公式或其他的技术限制或优点。我真的是一个使用javascript的初学者而且我不自信地就此提出建议,但我会提出一个案例,其中在变量中存储函数不起作用。

在下面的代码中,定义一个Angular过滤器,如果我在变量中定义了函数,那么我就无法从过滤器方法中成功调用它。有人能解释一下这个技术原因吗?

查看代码(评论不起作用):

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 "?";
    }
  };
};
*/

提前谢谢!

答案 6 :(得分:0)

我看到没有人提到(直接和实际上-这似乎是关于这个问题的)我个人认为对将函数存储在变量中最有用的原因。该原因是在处理复杂的逻辑,该逻辑需要很多选择(例如if)来确定应调用不同功能(可能也具有不同输入集)的进一步操作过程。在逻辑的最后,如果只在一个地方启动进一步的操作,它将使代码更整洁。

function fooA (input) {...};
function fooB (input) {...};
let chosenHandler;
let chosenInput;

// Here we establish which function is relevant
if (someCondition) chosenHandler = fooA;
else chosenHandler = fooB;

// Here we establish which parameter should be used
if (someOtherCondition) chosenInput = 'First input';
else chosenInput = 'Second input';

// Call chosen function with chosen parameters - one place, nice and clean
chosenHandler(chosenInput);

如果我们尝试直接调用函数,则代码将变得更加混乱,并且逻辑越复杂,则混乱的程度就越大。