Javascript 什么时候应该将函数存储到变量中?

Javascript 什么时候应该将函数存储到变量中?,javascript,node.js,Javascript,Node.js,我现在正在学习JavaScript,我不太明白什么时候应该将函数写入变量 例如,以下两个代码块在Node.js中的作用完全相同: var onReq = function(req, res) { res.write('Hello'); }; http.createServer(onReq).listen(3000); 及 根据最佳实践,哪种方法是最好的方法?为什么?根据John Resig的文章,您的第一个代码块被认为是最佳实践。通常,当我以后需要重新定义该函数的操作时,我只会使

我现在正在学习JavaScript,我不太明白什么时候应该将函数写入变量

例如,以下两个代码块在Node.js中的作用完全相同:

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

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




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

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

通常,当我以后需要重新定义该函数的操作时,我只会使用
var funcName=function(){}
。例如:

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

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

bar = foo(bar);

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

以下是一个解释:

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

  • 函数名不能更改,而函数分配给的变量可以重新分配
  • 函数名只能在函数体中使用。尝试在函数体之外使用它会导致错误(如果函数名以前是通过var语句声明的,则为未定义)

我默认为非变量的
函数onReq(){}
版本。这不是我做出的一个明智的决定,但仔细想想就会产生以下论点:

  • 看起来更干净
  • 它在概念上更简单:它只是一个函数,而另一个是一个函数和一个变量。这是件小事,但我仍然觉得它很有价值
  • <> LI>保证了<代码> OnReq总是指函数体——读代码时要考虑的事情少一点。有点像在Java中将变量标记为
    final
  • 防止我“意外”更换该功能,从而在其他地方造成意外的副作用

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


鉴于函数不应在全局名称空间中分离,大多数函数都是局部函数,因此始终对函数使用变量语法是有意义的。

我在这里看到了一些不同的观点,但大多数观点更多地基于您认为是好还是不好,但我看不到何时使用其中一种的技术原因,但可以肯定的是,使用一种或另一种申报公式存在技术限制或优势。我确实是javascript的初学者,我没有信心就此提出建议,但我将提出一种情况,即在变量中存储函数是不起作用的

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

请参阅代码(注释无效):


提前谢谢你

我发现没有人(直接和实际地——这似乎是关于这个问题)提到我个人认为在变量中存储函数最有用的原因。这个原因是处理一个复杂的逻辑,需要很多选择(例如,
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);

如果我们试图直接调用函数,代码会变得更加混乱,逻辑越复杂,代码也会变得越混乱。

对于这个问题,您需要更多地关注字符串变量、整数和浮点变量;重复:第二种形式的优点是,例如,如果它是一个非常长的函数,您可以将其移动到当前变量范围的底部,以使其不碍事,但仍可以在更高的位置使用它。这可以派上用场。你甚至可以把它放在最后一个
return
语句下面,它仍然可以工作。我明白你的意思,但最好还是用前面的方法声明函数,对吗?只是一个简单的补充。fn声明中的函数名(正如MDN使用的术语)可以更改-只需将其分配给一个新变量即可获得对函数的另一个引用。函数名也可以在以后的代码中重新分配给另一个函数(或完全其他函数)。另一个区别是函数声明会将赋值提升到作用域的顶部,而使用变量只会提升变量的声明。这两个观点似乎都不正确。对于第一个函数,有点难理解您在说什么,但是在这两种情况下,引用函数的变量都可以重新赋值。第二点是不对的。如问题所示,函数名可以在函数体之外使用。您想到的是一个命名函数表达式,问题中没有显示。通过上面的一个重复链接,kangax更详细、更微妙地介绍了这一点(例如,指出我对提升行为的评论实际上可能因浏览器而异)。绝对值得一看。不要太受它的影响。在很多情况下,使用函数声明并利用它被提升到代码顶部这一事实更为可取。遗憾的是,他建议
//不要这样做:函数getData(){}
,因为这样可以更容易地将函数作为对象进行教学。让它更容易教学是一个很糟糕的理由,让初学者一开始就以为它有问题。
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 "?";
    }
  };
};
*/
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);