🚀 函数声明与函数表达式的区别是什么?
欢迎来到我的博客文章!所有文章都是满满的前端干货,文章简明扼要。
一、语法形式对比
✅ 函数声明
function myFunction() {
console.log('这是函数声明');
}
✅ 函数表达式(Function Expression)
const myFunc = function() {
console.log('这是函数表达式');
};
const myFunc2 = function namedFn() {
console.log('这是命名函数表达式');
};
二、核心区别:变量提升(Hoisting)
这是两者最根本的区别!
🔹 函数声明:整个函数被提升
myFunction();
function myFunction() {
console.log('Hello');
}
JS 引擎会将整个函数体提升到作用域顶部。
可以在定义之前调用。
🔹 函数表达式:只有变量声明被提升,赋值不会
myFunc();
const myFunc = function() {
console.log('Hello');
};
const/let 声明的变量存在暂时性死区(TDZ),在赋值前访问会报错。
三、对比总结表
| 特性 | 函数声明 | 函数表达式 |
| 语法 | function name() {} | const name = function() {} |
| 变量提升 | ✅ 整个函数提升 | ❌ 只有变量声明提升 |
| 定义前调用 | ✅ 可以 | ❌ 不可以 |
| 必须有名字 | ✅ 是 | ❌ 否(可匿名) |
| 作为值传递 | 需要引用名字 | ✅ 直接作为值 |
四、典型使用场景
✅ 函数声明:适用于通用工具函数、顶层逻辑
function formatDate(date) {
return date.toISOString();
}
function init() {
setupEventListeners();
loadData();
}
✅ 函数表达式:适用于回调、对象方法、模块化、IIFE
setTimeout(function() {
console.log('延迟执行');
}, 1000);
const obj = {
method: function() {
console.log('对象方法');
}
};
(function() {
console.log('立即执行');
})();
五、最佳实践建议
💡 推荐做法
- 如果函数是模块的公共 API 或通用工具,用函数声明。
- 如果函数是回调、私有逻辑、或需要动态创建,用函数表达式(推荐 const + 命名函数表达式)。
- 避免在条件语句中使用函数声明。