函数声明与函数表达式的区别
2022年6月12日大约 2 分钟
函数声明与函数表达式的区别
函数表达式是将函数赋值给变量的方式来定义函数
var func1 = function (value) {
console.log(value);
};函数声明是使用 function 关键字进行定义的
function func2(value) {
console.log(value);
}函数表达式与函数声明主要的区别有以下几点:
- 变量提升:
函数声明会发生变量提升,即在声明前调用并不会抛出异常。
本方案使用 Var 定义的变量也会发生变量提升,但是只是声明了变量并未对齐赋值,所以使用 var 定义的函数在未定义前调用会抛出异常,但是打印变量不会。
- 作用域:
函数声明的作用域是在声明它们的作用域中。例如,在函数内部声明的函数将在整个函数内部可见。
函数表达式的作用域取决于它们的定义位置。如果在全局作用域内定义,它们将在整个全局作用域内可见;如果在函数内部定义,它们将仅在该函数内可见
- 命名:
函数声明需要一个名称,而函数表达式可以是匿名的,也可以有名称。
匿名函数表达式可以在函数体内部引用自身,但函数声明无需这样做。
- 语法
函数声明使用 function 关键字来定义函数,后跟函数名称和参数列表。
函数表达式将函数赋值给一个变量,函数可以是匿名的或具有名称,语法类似于赋值表达式。
背景
「函数声明与函数表达式的区别」属于语言语义边界主题。该类问题在重构阶段最容易引发“代码没报错但行为变了”的隐性风险。
核心原理
需要同时理解语法定义与运行时行为:作用域、提升规则、this 绑定、短路语义、类型判定边界。
实现方式 / 示例
建议每个结论都配“正例 + 反例 + 适用边界”,并明确推荐写法与禁用写法。
常见问题
- 只背结论,不验证边界。
- 在不同场景复用同一写法,忽略语义差异。
- 声明方式选择缺乏规则时,可读性与时序语义问题会长期存在。
最佳实践
将知识点同步到 ESLint 规则、代码评审清单与模板代码,形成自动化约束。
总结
围绕「函数声明与函数表达式的区别」的关键不是记忆语法,而是把语义边界沉淀为可执行规范。
