命名函数(函数声明)具有提升特性,可先调用后定义;函数表达式(含匿名与命名形式)需先赋值后调用,命名仅在内部有效,适用于动态场景与闭包。

JavaScript 中定义命名函数和使用函数表达式,核心区别在于语法形式、作用域行为和调用时机。命名函数通常指函数声明,而函数表达式常以变量赋值方式出现,可匿名也可具名。
命名函数:用函数声明方式定义
命名函数最典型的方式是函数声明(Function Declaration),使用 function 关键字 + 函数名 + 参数列表 + 函数体:
- 语法结构清晰,函数名必须存在,不可省略
- 具有“提升”(hoisting)特性:整个函数定义会被提前到当前作用域顶部,允许在声明前调用
- 适合定义工具类、模块级或需多次调用的公共函数
示例:
function sayHello(name) {
return `Hi, ${name}!`;
}
console.log(sayHello("Tom")); // 正常输出 "Hi, Tom!"
// 即使把 console.log 放在 function 前面,也不报错
函数表达式:把函数赋给变量
函数表达式(Function Expression)本质是将一个函数作为值赋给变量,常见形式是 const/let/var + 变量名 = function(参数) { ... }:
- 变量声明会提升,但函数体不会——必须在赋值之后才能调用
- 可以是匿名的(无函数名),也可以是命名的(函数名仅在内部有效,用于递归或调试)
- 适合动态创建、作为参数传递、或配合闭包封装私有逻辑
示例(匿名):
const add = function(a, b) {
return a + b;
};
console.log(add(2, 3)); // 输出 5
// 若在此行之前调用 add(),会报错 "add is not a function"
命名函数表达式:带名字的函数表达式
在函数表达式中显式写出函数名,称为命名函数表达式(Named Function Expression):
- 函数名只在函数内部可见,外部无法访问该名称
- 主要用途:支持函数内自调用(递归)、提升错误堆栈可读性(报错时显示函数名)
- 不影响变量名,调用仍通过变量名进行
示例:
const factorial = function fact(n) {
if (n return n * fact(n - 1);
};
console.log(factorial(4)); // 输出 24
console.log(fact); // ReferenceError: fact is not defined(外部不可访问)
关键注意事项
区分二者不只是写法差异,更影响执行顺序与调试体验:
- 不要混用:比如
function myFn() {}是声明;const myFn = function() {}是表达式,即使名字一样,它们是不同机制 - 箭头函数属于表达式变体,但没有自己的
this和arguments,也不支持new调用 - 现代开发中,函数声明多用于顶层逻辑,函数表达式更常用于事件回调、高阶函数或模块导出
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











