什么时候应该将一个函数存储到variables中?

我现在正在学JavaScript,而且我不太明白什么时候写一个函数到variables中。

例如,以下两个代码块在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); 

否则,对于大多数目的(假设它不是callback或修饰符)通常可以接受“声明”函数。

我默认使用function onReq(){}版本的非variablesfunction onReq(){} 。 这不是我做出的一个明智的决定,但是考虑到这个问题,

  • 它看起来更干净。
  • 它在概念上更简单:它只是一个函数,而另一个是一个函数和一个variables。 这是一件小事,但我觉得它是有价值的。
  • 它向我保证, onReq将始终引用函数体 – 读取代码时要考虑的一件事。 有点像在Java中将variables标记为final
  • 使我免于“意外”更换function,导致其他地方出现意想不到的副作用。

这是一个解释:

函数名称和函数分配的variables之间有区别:

  • 函数名称不能改变,而函数分配的variables可以重新分配。
  • 函数名称只能在函数体内使用。 尝试在函数体外使用它会导致一个错误(如果函数名是通过一个var语句声明的话,那么这个错误是未定义的)。

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

根据John Resig的JavaScript作为第一语言的文章,您的第一个代码块被认为是最佳实践。

在个别版本的IE(很可能是IE8或更低版本)中使用非variables语法时,我个人遇到了调用本地函数(在其他函数中声明的函数)的某些问题,而variables语法的工作方式与预期的一样。

鉴于函数不应该在全局名称空间中被降级,大部分函数都是局部的,因此总是对函数使用variables语法是有意义的。

我在这里看到了一些不同的观点,但是其中大部分都是基于你认为更好或者不是更好的基础上的,但是我没有看到何时使用这个或那个的技术原因,但是肯定有技术上的限制或者优点使用一个声明公式或另一个。 我真的是一个JavaScript的初学者,我不觉得有信心build议,但我会build议一个情况下,一个variablesfunction存储不起作用。

在下面的代码中,定义了一个Angularfilter,如果我在variables中定义函数,那么我不能从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 "?"; } }; }; */ 

先谢谢你!