将函数分配给var有什么好处?


Answers:


8

我认为简短的答案就是,您正在创建分配给变量的匿名函数,而不是使用...创建命名函数。

    function sum() {}

检查差异的一种好方法是在它们上调用.ToString()并查看差异,或者可以执行console.log(sum.name)。一个将给出实际名称,而另一个则不给出任何名称,即匿名函数(分配给var的匿名函数)。也有一些细节,例如在运行时定义var sum = function(){},而在解析时定义函数sum(){}。


我最后一句话的意思是,如果您尝试在var定义的上方的前一行中调用sum(),则会出现错误。如果在我的答案中进行了定义,那么即使调用在函数之上,也不会出错。
谐波键

12
那解释了差异,但是我认为它没有解释优势
基思·汤普森

解析时间和运行时有什么区别?
Wern Ancheta 2012年

1
与命名函数没有任何关系,您仍然可以将命名函数分配给变量
Juan Mendes 2013年

5

一个优点是您不能在块中使用函数声明。它们只能位于文件的顶层,也可以直接位于另一个函数中。

if (true) {
  function foo() {}
}
try {
  function foo(){}
}
switch (true) {
  default:
    function foo(){}
}

这些都是标准未指定的,浏览器会执行不同的操作,请参阅/programming/10069204/function-declarations-inside-if-else-statements。因此,如果有时不得不使用其他样式,则为了保持一致性,您可能总是需要这样做

另外,我不确定这一点,但是如果我没记错的话,一些老的minifiers不够聪明,无法处理函数声明并且不重命名它们。


3

我不是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() {...}

0

这主要是风格问题,因为在我看来,唯一出现差异的情况(在结束所有声明之前调用某些函数;使用toString方法)是一种极端的情况。

我听到的支持这种var =样式的论点之一是,它与声明普通变量的方式一致。这限制了您使用的语言功能的数量,并使向Java新手介绍程序​​变得更加简单。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.