2011-03-25 68 views
14

的B/W函数声明&函数式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引擎的变化,还是此举有意?

+3

你使用什么浏览器或JavaScript引擎? – 2011-03-25 14:37:22

+0

它实际上在Firefox中更快。 – 2011-03-25 14:38:58

+3

这些结果是非常有趣的,而在Chrome和Opera中它的速度却慢了90%,实际上它在FF中速度更快。我会说,这并不重要,因为如果你声明了足够的功能,这会成为一个问题,那么你做错了什么。 – idbentley 2011-03-25 14:40:27

回答

1

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

2

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已经在运行时解释函数声明,引起的壁虎函数声明与函数表达式速度之间没有太大的区别基于浏览器。

+0

_“Firefox必须在运行时解释函数声明”_这很糟糕。它是否在新版本中修复? – Anish 2011-03-25 15:37:06

+0

@Anish:固定?这是一个[功能](https://developer.mozilla.org/en/JavaScript/Reference/Statements/function):“JavaScript 1.5,NES 6.0:添加了条件函数声明(Netscape扩展)”。也就是说,团队正在尽可能快地制作JS引擎。 – 2011-03-25 16:08:01

+0

从_kangax的article_我知道,只有当它们是函数声明的一部分时,Firefox才会在运行时解释函数声明。当函数声明被正常定义时,我猜他们是在解析时间期间定义的? – Anish 2011-04-01 06:30:33