掌握三种函数声明方式的关键在于理解其控制权归属、作用域与执行时机差异:声明式适合顶层逻辑与公共接口,赋值式适合动态行为与局部封装,构造函数式虽少用但有助于理解函数本质。

掌握三种函数声明方式本身不是目的,关键在于理解每种方式背后的控制权归属、作用域行为和执行时机差异。把它们混用不是炫技,而是让代码在不同场景下自然选择最合适的表达。
声明式:适合顶层逻辑与公共接口
function关键字声明的函数会被提升(hoisting),在文件顶部就可调用。它天然适合定义模块主入口、工具函数集合或需要被前置调用的初始化逻辑。
比如一个配置加载模块:
- 用声明式写loadConfig(),确保哪怕在文件开头就调用也不会报错
- 函数名明确体现意图,团队协作时一眼可知这是“可信赖的公开能力”
- 不建议在里面写复杂状态闭包——它的设计初衷是清晰、稳定、易测试
赋值式:适合动态行为与局部封装
var/let/const + function() {} 这种写法不会被提升,执行到那一行才创建函数对象。它更适合封装临时逻辑、构建回调链、或配合条件分支生成不同行为。
例如处理不同数据源的解析器:
- 根据环境变量决定parser = isJson ? parseJson : parseCsv
- 后续统一调用parser(data),无需重复判断
- 函数作为值参与运算,天然支持高阶函数、节流防抖等模式
构造函数式:极少直接使用,但理解它能打通底层认知
new Function('a', 'b', 'return a + b') 是运行时动态生成函数,性能低且有安全风险,日常开发基本不用。但它揭示了一个本质:函数对象本质上是可执行的代码字符串编译结果。
真正有价值的是这个认知带来的启发:
- 当看到eval或Function调用时,立刻意识到这是“代码即数据”的临界点,需严格校验输入
- 理解为什么箭头函数没有arguments和prototype——它绕过了传统函数对象的构造流程
- 在写插件系统或DSL解析器时,能坦然面对动态函数生成的边界与代价
专家级代码不是堆砌语法,而是在声明方式之间无声切换:该提升的让它提升,该延迟的让它延迟,该隔离的彻底隔离。函数怎么声明,取决于你想把它放在代码生命周期的哪个位置、赋予它多大范围的责任,而不是“哪种更高级”。

















