JavaScript严重执行函数:内联还是声明?

假设对于时间要求严格的应用程序来说,使用函数声明或函数expression式总是比较好,而不是在大量执行的callback函数中使用内联函数?

考虑下面的testing程序:

var x; var count3 = function count3() { x++; } var count2 = function () { x++; } function count() { x++; } function execute(cb) { cb(); } x = 0; var a = new Date().getTime(); for (var i = 0; i < 100000000; i++) { execute(function named() { x++; }) } a = new Date().getTime() - a; console.log("Named inline function: " + a); x = 0; a = new Date().getTime(); for (var i = 0; i < 100000000; i++) { execute(function () { x++; }) } a = new Date().getTime() - a; console.log("Anonymous inline function: " + a); x = 0; a = new Date().getTime(); for (var i = 0; i < 100000000; i++) { execute(count); } a = new Date().getTime() - a; console.log("Function declaration: " + a); x = 0; a = new Date().getTime(); for (var i = 0; i < 100000000; i++) { execute(count2); } a = new Date().getTime() - a; console.log("Anonymous function expression:" + a); x = 0; a = new Date().getTime(); for (var i = 0; i < 100000000; i++) { execute(count3); } a = new Date().getTime() - a; console.log("Named function expression:" + a); 

这给出以下输出(以毫秒为单位):

 Named inline function: 2347 Anonymous inline function: 2121 Function declaration: 771 Anonymous function expression:750 Named function expression:752 

函数声明和函数expression式比我谦虚的笔记本上的内联函数快3倍。

是的,这是可以概括的。 从技术上讲,循环体中的函数expression式在每个循环中都被重新评估为一个新的函数对象。 正如你的testing所证实的那样,这比在循环之外定义一个“静态”函数慢得多(对于数百万次的迭代)。 函数是否被命名并不重要,在执行上下文中引入另一个variables的开销非常小。

但是,只有在迭代中声明函数的时候才会这样,就像你的例子。 如果你有一个

 function executeAll(cb) { for (var i = 0; i < 100000000; i++) { cb(); } } 

那么就没有区别了

 executeAll(function() { x++; }); 

 function increase() { x++; } executeAll(increase); 

因为cb参数是一个函数的“静态”引用。