函数声明必须是独立语句且有名称,会被提升;不可出现在条件或循环块内(严格模式报错);作用域由位置决定,严格模式禁止参数重名和块级声明。

JavaScript 函数声明本身没有语法上的“定义限制”,但它的行为受作用域、提升(hoisting)、严格模式和执行上下文等机制约束。关键不是“不能怎么写”,而是“这么写会怎样”。
函数声明必须是独立语句
函数声明必须作为顶层语句或嵌套在其他函数/块中,不能出现在条件语句、循环或表达式上下文中(如 if 或 for 内部)——否则在非严格模式下行为不一致,严格模式下直接报错。
- ✅ 合法:
function foo() {}(直接写在脚本或函数体顶部) - ❌ 非法(严格模式报 SyntaxError):
if (true) { function bar() {} } - ⚠️ 注意:某些引擎允许块级函数声明,但它是非标准行为,ECMAScript 规范明确要求函数声明应为“源元素”(SourceElement),即语句级结构
函数名不可省略且会被提升
函数声明必须有标识符(函数名),且整个声明(名 + 体)会被提升到当前作用域顶部,可在声明前调用。
- ✅
console.log(add(1,2)); function add(a,b){return a+b;}正常运行 - ❌
function () {}是语法错误——匿名函数不能以声明形式出现 - ⚠️ 函数名在作用域内不可被重新声明:
function fn(){}; function fn(){}后者会覆盖前者(非严格模式);严格模式下重复声明仍允许,但逻辑上不推荐
作用域决定可见性,而非访问修饰符
函数声明的作用域由其出现位置决定:全局声明 → 全局作用域;函数内声明 → 仅该函数内部可访问。
- 内部函数不会自动成为外部函数的属性:
outer.inner无效,即使inner是outer内的声明 - 无法通过
this绑定暴露(除非显式赋值):this.inner = function(){}依赖调用方式,不是通用方案 - 若需对外提供,必须显式返回、挂载对象或导出——这是封装设计选择,不是语法强制
严格模式强化约束
启用 "use strict" 后,部分宽松行为被禁止,让定义更可靠。
- 禁止八进制字面量、
with语句、隐式全局变量等 - 函数参数不允许重名:
function f(a, a) {}在严格模式下抛SyntaxError - 函数声明不能出现在块中(如
{ function g(){} }),否则报错
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











