【问题标题】:Anonymous function VS const function - javascript匿名函数 VS 常量函数 - javascript
【发布时间】:2016-03-14 21:40:08
【问题描述】:

根据这次讨论:

我对 JavaScript 中的函数声明有疑问。

通过匿名函数声明,我的意思是这样的 (https://en.wikibooks.org/wiki/JavaScript/Anonymous_Functions):

var myFunction = function (fruit){
    alert('I like ' + fruit);
}

我的意思是 const:

const myfunction = (fruit) => alert('I like ' fruit);

是使用匿名函数还是使用 const 更快?我读过使用 const 可以在 JavaScript 中进行编译优化。有什么理由我应该使用一个而不是另一个?

这是否相关?

【问题讨论】:

  • 除非您在一个循环中创建数千个函数,否则我怀疑它不会有丝毫不同。使用语义正确的任何一个。
  • 我被否决是因为?
  • 因为这个问题只能产生固执己见的答案。微优化和个人喜好是您主要得到的。 (顺便说一句,我没有投反对票)
  • 这种优化,即使您确定它是可能的,通常也无需担心。事态——特别是对于像 JavaScript 这样积极开发的语言——可能会随着编译器或运行时系统的下一个版本而改变。追求微小的“优化”并不值得为算法改进而付出的类似努力所带来的性能的一小部分。
  • “匿名函数声明我的意思是这样的:” 这不是匿名函数。这是一个函数声明,使用名称myFunction。 (作为一个声明,它的末尾不需要;。)

标签: javascript function constants


【解决方案1】:

匿名函数 VS 常量函数

大概是在比较

var func = function() { };
// or
let func = function() { };

const func = function() { };

这样做的主要原因不是优化。它通过代码记录您从不打算更改func,并让引擎保护您免于意外这样做。 (我还应该注意,从 ES2015 开始,none 这些函数都是匿名的。它们都具有名称 func,因为 ES2015 添加了为通过基于“匿名”函数表达式创建的函数分配名称的规则关于上下文,包括上述简单分配的规则。)

但是关于优化:

与大多数 JavaScript 优化问题一样,答案是:视情况而定。理论上,如果您从不打算更改 func 中的值,则使用 const 意味着 JavaScript 引擎可以选择在该值永远不会更改的情况下进行优化。请注意,它不会免除引擎处理符号在嵌套范围或类似范围内被隐藏的可能性。

引擎是否确实基于该知识以有意义的方式进行优化,值不会改变将取决于引擎的实现,并且可能会因引擎而异。

这是否使得通过常量查找函数以便调用它比通过变量查找更快也取决于引擎的实现。

任何绝对差异是否会转化为您的程序中的实际收益将取决于上述情况、您的程序的结构、您使用函数的频率、查找时间与函数实际执行时间的比较(例如,沼泽)等。

这取决于。 :-)

如果您遇到一种情况,您认为查找时间会导致实际问题,请对其进行分析,看看它是否会产生影响。


重新编辑:

匿名函数声明的意思是这样的:

function myFunction(fruit){
    alert('I like ' + fruit);
};

我的意思是 const:

const myfunction = (fruit) => alert('I like ' fruit);

第一个不是匿名函数。这是一个名为myFunction 的函数,通过函数声明 创建。 (并且作为声明,最后不需要;。)函数声明不能​​创建匿名函数,名称是声明的必需部分。

也就是说,这并不重要,因为一旦创建了函数(发生的时间与我上面展示的表达式不同),它的行为与var func = ... 示例的行为非常相似,就@987654333 @已解决,是否可以更改func

您的第二个示例与您的第一个示例不同之处不是一个,而是 三个

  1. 它将函数引用分配给一个常量。

  2. 它使用箭头函数,而不是 function 函数(由于没有更好的术语,我将称之为“简单”函数)。

  3. 您的箭头函数版本返回调用alert 的结果(因为您在箭头函数上使用了concise body)。您的声明版本没有。

我们已经处理了#1 的所有性能方面。我怀疑,#3 不太重要。

关于#2(它是一个箭头函数):调用箭头函数比调用一个简单函数需要更少的工作(理论上)。引擎不必设置arguments 伪对象,也不必创建this 绑定。但是如果箭头函数使用this,则需要更多 工作来查找它(它就像函数关闭的外部范围中的变量)。但是,这就是理论。只要副作用不明显,引擎就可以优化。例如,如果您不在代码中使用arguments,现代引擎无论如何都会避免创建它,即使对于简单的函数也是如此。而且我希望围绕 this 的箭头函数使用的优化非常好,因为一旦函数存在,他们看到的 this 就无法改变。

所以(等待它):这取决于。

【讨论】:

  • 很抱歉我的错误引导编辑,我已经习惯了声明我忘记的函数。我现在修好了!
猜你喜欢
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多