Answers:
我认为简短的答案就是,您正在创建分配给变量的匿名函数,而不是使用...创建命名函数。
function sum() {}
检查差异的一种好方法是在它们上调用.ToString()并查看差异,或者可以执行console.log(sum.name)。一个将给出实际名称,而另一个则不给出任何名称,即匿名函数(分配给var的匿名函数)。也有一些细节,例如在运行时定义var sum = function(){},而在解析时定义函数sum(){}。
一个优点是您不能在块中使用函数声明。它们只能位于文件的顶层,也可以直接位于另一个函数中。
if (true) {
function foo() {}
}
try {
function foo(){}
}
switch (true) {
default:
function foo(){}
}
这些都是标准未指定的,浏览器会执行不同的操作,请参阅/programming/10069204/function-declarations-inside-if-else-statements。因此,如果有时不得不使用其他样式,则为了保持一致性,您可能总是需要这样做
另外,我不确定这一点,但是如果我没记错的话,一些老的minifiers不够聪明,无法处理函数声明并且不重命名它们。
我不是Java语言专家,因此请放心食用。我认为在某些情况下,人们可能会出于风格而这样做,而只需编写“ function sum(){...}”,就可以实现相同的目的
但是,将函数分配给变量是函数编程中非常强大的技术。如果您熟悉OOP,则它有点类似于多态。想想动物基类和猫/狗派生类的经典示例。您可以编写适用于Animal的代码,但是当它调用一个函数时,该函数可以根据实例的类型执行不同的工作。
在函数式编程中,可以有一个与“函数”一起使用的算法,但是如果您使用变量来调用该函数,则可以灵活地在运行时分配其他函数。
例如,假设您编写了一种算法,以在仅500个像素的窗口中显示10,000个数据点。每个像素将代表20个数据点,并且要显示它们,您需要将这20个数据点汇总为一个值。
因此,假设您定义了一种表示10,000个点的算法,并且该算法使用称为聚合的函数变量,如下所示:
...
displayValue = aggregate( numbersInOnePixel );
...
现在,在运行时,您的用户可以选择如何聚合数据。您的实际函数变量可以是以下任意一项:
aggregate = function sum() {...}
aggregate = function min() {...}
aggregate = function max() {...}
aggregate = function average() {...}