函数声明是用function关键字定义的具名函数,具有提升特性,可在定义前调用;其函数名遵循变量命名规则,参数按值传递,支持默认值与arguments对象;仅函数声明具备完整提升、具名调试及递归能力,且不可出现在块级条件中。

JavaScript 函数声明的核心是 function 关键字 + 函数名 + 参数列表 + 函数体,它不是简单语法糖,而是具有提升(hoisting)特性的正式定义方式。
函数声明的基本结构
标准写法如下:
function functionName(param1, param2) {
// 执行逻辑
return value;
}
- function 是必需的关键字,不能省略
- functionName 遵循变量命名规则:字母、数字、下划线、$ 组成,不能以数字开头,不能是保留字
- 参数列表 放在圆括号内,多个参数用逗号分隔;无参时括号保留但为空
- 函数体 用花括号包裹,即使只有一行语句也建议保留大括号,增强可读性与维护性
-
return 语句 是可选的;不写时函数默认返回
undefined
函数名与作用域关系
函数声明会在当前作用域顶部被“提升”,意味着可以在定义之前调用:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
console.log(add(2, 3)); // ✅ 正常输出 5
function add(a, b) {
return a + b;
}
- 这种提升仅适用于 函数声明,不适用于函数表达式或箭头函数
- 函数名在声明所在作用域内成为绑定标识符,不可重复声明(否则报错 TypeError)
- 嵌套函数声明只在父函数内部有效,外部无法访问
参数处理的细节规则
参数在函数体内表现为局部变量,其行为受 JavaScript 的传参机制影响:
- 所有参数按值传递:原始类型(如 number、string)传副本,修改不影响外部;对象类型传的是引用地址的副本,内部修改属性会影响原对象
- 支持默认参数:可在形参后直接赋值,如
function greet(name = "Guest") { ... } - 参数个数不严格匹配:多传会被忽略,少传则对应参数为
undefined(除非设了默认值) - 可通过
arguments对象访问实参列表(注意:箭头函数没有arguments)
与其他函数定义方式的本质区别
函数声明和函数表达式、箭头函数在行为上存在关键差异:
- 只有函数声明具备完整提升能力;函数表达式只是变量声明被提升,赋值不会提升
- 函数声明有明确的函数名,可用于调试堆栈、递归调用或
name属性识别;匿名函数表达式和多数箭头函数的name为空字符串 - 函数声明不能出现在条件语句或循环块内(ES5 严格模式下会报错,ES6+ 允许但行为复杂,应避免)
- 箭头函数没有自己的
this、arguments、super或new.target,也不可作为构造函数使用

















