函数优化重在“稳”和“明”,优先用函数表达式替代声明以避免提升问题;避免条件中声明函数;减少嵌套、提取独立单元;慎用arguments,倾向rest参数;警惕闭包导致内存驻留。

函数声明本身不是性能瓶颈,但写法不当会影响可读性、维护性甚至执行效率。优化重点不在“快”,而在“稳”和“明”。
优先使用函数表达式替代函数声明(尤其在块级作用域中)
函数声明会提升(hoisting),容易引发意料之外的执行顺序问题;而函数表达式更符合直觉,且在 if、for 等块中行为明确。
- 避免在条件语句里用函数声明(不同引擎行为不一致,ES 规范不鼓励)
- 模块内部或立即执行场景下,用
const myFn = function() { ... }或箭头函数更安全 - 需动态生成函数时,表达式天然支持闭包捕获变量,逻辑更可控
减少嵌套函数声明,提取为独立单元
深层嵌套的函数不仅增加调用栈深度,还让调试和单元测试变得困难。每个函数应有单一职责。
- 把循环内创建的函数移出循环体,避免重复定义
- 将回调中复杂的逻辑拆成具名函数,提升可读性和复用性
- 利用参数或闭包传递上下文,而非层层嵌套访问外层变量
谨慎使用 arguments 和 rest 参数
arguments 是类数组对象,非真正数组,且在严格模式下受限;现代代码应倾向使用 rest 参数(...args),它更清晰、可枚举、与解构兼容。
- 避免混用
arguments和箭头函数(箭头函数没有自己的arguments) - 需要操作参数时,直接用
...args转为数组,如Array.from(args)或展开运算符 - 若只需第一个参数,不要写
function(...args) { return args[0]; },直接写function(first) { return first; }
避免无意中创建闭包导致内存驻留
函数声明常伴随闭包,这是优势也是风险——引用外部大对象或 DOM 节点时,可能阻止垃圾回收。
- 检查函数是否意外捕获了不需要的变量(比如整个
data对象,其实只用其中一两个字段) - 在事件监听器或定时器中,及时解除引用或使用弱引用策略(如
WeakMap缓存) - 长生命周期函数(如全局工具函数)尽量保持纯净,避免依赖外部可变状态
不复杂但容易忽略。写函数不是为了“能跑”,而是为了让别人(包括未来的你)一眼看懂它想做什么、依赖什么、改哪里不会出错。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











