JavaScript函数调用方式的性能问题

3
有一些性能方面的差异,下面是两个例子:
例子1:
function abc(x,y){
  return x + y;
}

abc();

示例2:

abc();

function abc(x,y){
  return x + y;
}

示例3:

var abc = function(x,y){
  return x + y;
}

abc();

哪个更好,每个的优缺点是什么?

2
只是不同的写法而已,一旦被JavaScript引擎编译,它们就是相同的。如果您没有传递任何参数,那么除非函数实现与上述函数完全相似,否则您不会得到任何运行时异常。 - vijayP
2
嗯,从语法上来说是有区别的。第三个例子是一个函数表达式,请参见这里。就性能而言,我不认为会有什么差别。即使有,也应该非常微小。 - Andrew Li
1
极有可能在1和2之间没有性能差异,因为所有代码都会首先被解析,然后在任何执行开始之前处理函数声明。在3中可能会有轻微的惩罚,因为函数体直到执行期间才会被评估,但我怀疑这不是很重要。 - RobG
尝试使用AST Explorer:https://astexplorer.net/。基本上,JS引擎在执行之前以相同的方式解析您的所有代码。因此不用担心性能问题,只需关注您的编写风格即可。AST-抽象语法树是解析您的代码并在执行之前构建我们手头的代码的一种级别。 - NiRUS
2个回答

1
有两个JavaScript执行阶段: 1)创建阶段 2)执行阶段
创建阶段:在创建阶段中,所有变量和函数都被创建,并且在变量的情况下其值为未定义,例如在您的第二个案例中。
abc();

function abc(x,y){
  return x + y;
}

这里定义了函数abc(),在创建阶段就完成了定义,所以即使你先调用它,也不会出现任何错误。因为abc()是在执行阶段被调用的。如果你没有向函数x传递任何变量,则在这种情况下x和y将未定义。

执行阶段:在执行阶段中调用了在创建阶段中定义的函数abc。所以无论你在哪里调用一个函数,你都不会收到错误信息。

Javascript是同步的

Javascript中非常重要的一点是词法环境,即你的函数或变量所处的位置,以及所在的词法环境。


0

我认为在性能方面没有区别...但在语法方面有所不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接