【问题标题】:function declaration faster than function expression?函数声明比函数表达式快?
【发布时间】:2011-03-25 14:35:49
【问题描述】:

黑白函数声明和函数表达式的区别在var functionName = function() {} vs function functionName() {}中有很好的描述
这里提到了函数声明在解析时被评估,&函数表达式在执行阶段被评估

bytes.com 中提到函数声明比函数表达式快。

我为此创建了一个基本测试用例:http://jsperf.com/function-declaration-vs-function-expression

函数声明

function myfunc() {
 alert("yo");
}
myfunc();

函数表达式

var myfunc = function() {
 alert("yo");
}
myfunc();

测试表明函数表达式比函数声明慢90%

为什么会有这样的速度差异?

编辑
来自http://jsperf.com/function-declaration-vs-function-expression中的结果

Chrome, IE9, Opera & Safari -> 函数声明比函数表达式快

Firefox, IE7, IE8 -> 函数表达式比函数声明更快

IE9 中函数声明更快,而在 IE 7 & 8 中函数表达式更快。 是因为 IE9 中 JavaScript 引擎的变化,还是故意的?

【问题讨论】:

  • 您使用的是什么浏览器或javascript引擎?
  • 它在 Firefox 中实际上更快。
  • 这些结果非常有趣,虽然它在 Chrome 和 Opera 中慢了 90%,但在 FF 中实际上更快。不过我想说这并不重要,因为如果你声明了足够多的函数,这会成为一个问题,那么你就做错了。
  • @idbentley “如果你声明了足够多的函数,这会成为一个问题,那么你做错了什么”。像jsperf.com/function-declaration-vs-function-expression-2 这样的情况在现在的代码中很常见,对吧?是的,在优化时还有许多其他重要的东西需要考虑。但这不也应该考虑吗?
  • 当然,做这样的事情很常见,但是做的次数足够多以至于对性能产生明显的影响是不太可能的。例如,与执行 AJAX 请求或 DOM 操作相比,这算不了什么。我之前的声明是想说做大量的函数声明(足以造成性能影响)是代码味道,你应该考虑重构。

标签: javascript function performance


【解决方案1】:

Firefox 也有非标准的Function Statements,它可以有条件地在函数声明之间进行选择(根据规范,你不能)。只需使用example of Juriy "kangax" Zaytsev

if (true) {
    function foo(){ return 1; }
} else {
    function foo(){ return 2; }
}
foo(); // 1
// Note that other clients interpet `foo` as function declaration here, 
// overwriting first `foo` with the second one, and producing "2", not "1" as a result

所以这些是在执行时编译的,而不是在解析阶段:

在变量实例化期间不声明函数语句。它们是在运行时声明的,就像函数表达式一样。

其他浏览器可能会预编译函数声明,使其在运行时执行得更快,但 Firefox 必须在运行时解释函数声明,导致基于 Gecko 的浏览器中函数声明和函数表达式的速度差别不大.

【讨论】:

  • “Firefox 必须在运行时解释函数声明” 这很糟糕。它在新版本中修复了吗?
  • @Anish:修复了吗?这是feature:“JavaScript 1.5,NES 6.0:添加了条件函数声明(Netscape 扩展)”。也就是说,团队正在努力使 JS 引擎尽可能快。
  • 来自 kangax 的文章 我了解 Firefox 仅在函数声明是函数语句的一部分时才会在运行时解释函数声明。当函数声明被正常定义时,我猜它们是在解析时定义的?
  • @Anish:你一定是对的,因为函数语句只在运行时声明,但我仍然可以在脚本底部使用函数声明,这意味着 必须 是两者之间的功能差异。我一定是被语法困住了。感谢您指出这一点!
【解决方案2】:

这必须是与浏览器相关的问题。如果它是一个表达式而不是一个声明,一些浏览器可能会以不同的方式编译 javascript,而有些浏览器可能会完全一样地对待它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    相关资源
    最近更新 更多