JavaScript匿名函数与命名函数性能对比分析

作者:墨池

时间:2026-10-29

浏览:190

本文通过Node.js环境下的实测数据,对比了JavaScript中匿名函数与命名函数的执行性能。测试结果显示,虽然命名函数因只需解释一次而略快于每次重新解释的匿名函数,但两者在百万次调用下的耗时差异极小。文章进一步探讨了函数表达式与函数声明的性能细微差别,并指出在实际开发中,代码可读性与维护性应优先于这种微小的性能提升。

文章目录

匿名函数与命名函数性能对比

在JavaScript开发中,我们常使用匿名函数来编写回调逻辑。

匿名函数指的是没有名称的函数,通常用于立即执行场景。那么,它与拥有名称的命名函数在性能表现上究竟有何差异?

为了直观比较,我们可以选取一台支持Shell命令执行的计算机,通过大量函数调用来观察两者的耗时情况。

anonymous.js

代码如下:

var count = 100000000
, sum = 0
while (count--) (function() { sum++ })()

执行上述代码。


代码如下:

$ time node anonymous.js
real 0m1.456s
user 0m0.015s
sys 0m0.031s

接下来查看命名函数的执行情况。

named.js

代码如下:

var count = 100000000
, sum = 0
var cb = function() {\n\n sum++\n\n}
while (count--) cb()

执行该脚本。


代码如下:

$ time node named.js
real 0m0.575s
user 0m0.000s
sys 0m0.046s

数据显示命名函数速度更快。原因在于匿名函数在每次循环中都需要重新解析回调逻辑,而命名函数仅需解析一次,从而提升了性能。不过实测表明,这种提升幅度极小,完全无需为了追求这点性能而将便捷的回调单独提取为变量。

命名函数的定义方式与性能细节

此外,命名函数还有两种不同的定义方式。

函数表达式

代码如下:

var func = function() {
console.log('a')
}

函数声明

代码如下:

function func() {
console.log('b')
}

若同时使用这两种写法,可能会引发问题,例如:


代码如下:

var func = function() {
console.log('a')
}
function func() {
console.log('b')
}
//输出为: a

鉴于上述潜在问题,目前业界多采用函数表达式形式。那么,函数声明的性能表现如何呢?

named2.js

代码如下:

var count = 100000000
, sum = 0
function cb() {\n\n sum++\n\n}
while (count--) cb()

执行上述代码,并对比二者结果。

代码如下:

$ time node named.js
real 0m0.553s
user 0m0.000s
sys 0m0.015s
$ time node named2.js\n\nreal 0m0.529s\n\nuser 0m0.000s\n\nsys 0m0.047s

函数声明似乎略快于函数表达式,但差异微乎其微。个人建议仍优先使用函数声明式写法,以符合常规编码习惯。

注:以上测试数据均在Windows 7系统下使用git-base环境获取。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章