严格模式下函数声明只能出现在脚本顶层或函数体内,块级语句(如if、for)中声明会抛出SyntaxError;启用方式为在脚本或函数顶部添加"use strict",模块环境默认启用;推荐改用函数表达式配合let/const实现块级作用域。

严格模式本身不直接“硬性约束”函数声明的位置,但它能配合语法规范暴露问题,让非法写法提前报错,从而起到实际约束作用。
严格模式下函数声明的合法位置更明确
在非严格模式中,某些引擎(如旧版 Chrome 或 IE)允许在 if、for 等块内写函数声明,但行为不统一,属于非标准用法。开启严格模式后,JavaScript 引擎会按 ES 规范严格执行:函数声明只能出现在脚本顶层或函数体内部,其他位置(如块级语句中)将直接抛出 SyntaxError。
- ✅ 合法:全局作用域、函数体内
- ❌ 非法:if 块、for 循环、try/catch、对象方法外的任意块内
如何启用并验证约束效果
在脚本开头添加 "use strict",然后尝试在块内声明函数:
"use strict";
if (true) {
function foo() {} // SyntaxError: In strict mode code, functions can only be declared at top level or inside a block
}
浏览器或 Node.js 会立即报错,而不是静默容忍或产生不可靠行为。
- 注意:该错误发生在解析阶段(不是运行时),说明语法本身被拒绝
- 模块环境(
.mjs或type="module")默认启用严格模式,无需手动加"use strict"
替代方案:用函数表达式绕过语法限制
若逻辑上必须在条件分支中定义函数,应改用函数表达式(配合 let 或 const):
- 函数表达式是表达式,可出现在任意表达式位置,不受块级声明限制
- 结合
let/const可保证块级作用域和暂时性死区,避免变量泄露 - 示例:
if (x) { const handler = function() {}; handler(); }
为什么不能靠严格模式“修复”已有非标写法
严格模式不改变函数声明的提升规则,也不让块级函数声明“变合法”。它只是让违反规范的行为从“可能运行但结果不定”变成“直接报错”,迫使开发者回归标准写法。
- 非严格模式下块级函数声明是历史遗留,各引擎实现差异大(有的提升到函数作用域,有的只限块内)
- 严格模式下统一禁止,消除了歧义,提升了代码可移植性
- 真正可靠的跨环境写法,始终是函数表达式 + 块级绑定

















