是否应当避免使用嵌套函数?两种写法哪种性能更优?
嵌套函数性能问题答疑
旧观点的时效性
应尽量避免使用嵌套函数,因为它们始终会被lazily parsed(惰性解析),会被重复解析进而影响性能
这个说法在当下已经完全不成立了。
早期的JavaScript引擎确实存在这个问题:每次执行外层函数时,都会重新解析、编译内部的嵌套函数,带来额外的性能开销。但现在主流的JS引擎(Chrome的V8、火狐的SpiderMonkey、Safari的JavaScriptCore等)早在10年前就完成了对应优化:引擎会在首次加载代码时一次性完成所有函数(包括嵌套函数)的语法解析和预编译,不会每次调用外层函数时重复处理嵌套函数的代码逻辑。
两种写法的性能对比
嵌套写法
function fun() { function foo() {} foo(); }
现在这种写法的唯一额外开销,是每次调用fun时创建一个新的foo函数对象实例的成本,这个开销非常低,普通业务场景下完全感知不到。如果你的foo需要访问fun内部的局部变量/参数,或者你不希望foo对外暴露污染作用域,这是最优的写法。
外层声明写法
function foo() {} function fun() { foo(); }
纯性能角度看这种写法确实更好,因为foo只会在代码加载时被创建一次,后续调用fun不需要额外创建函数实例。但只有当你的fun属于超高频调用的热点路径(比如每秒调用次数超过10万次),且foo不需要访问fun内部变量的时候,这个性能差异才有实际意义。
选择建议
绝大多数业务开发场景下,优先选择嵌套写法,更好的封装性带来的可维护性收益,远大于可以忽略不计的性能损失。只有当你做性能分析时明确发现嵌套函数的创建是性能瓶颈时,再考虑把不需要访问外层作用域的嵌套函数提到外层。
内容的提问来源于stack exchange,提问作者Haitham6373
相关产品推荐
相关产品推荐

