异步函数默认且强制启用严格模式,无法退出;其函数体始终按严格模式解析执行,禁止隐式全局变量、with语句、重复参数等,与普通函数需显式声明严格模式不同。

JavaScript中异步函数(async function)在严格模式下并无特殊行为差异——它**默认就是严格模式**,且无法退出。
异步函数自动启用严格模式
根据ECMAScript规范,async function的函数体内部始终运行在严格模式下,无论外部是否使用"use strict",也不受所在脚本或外层函数模式影响。
- 不能使用
with语句(语法报错) - 变量必须显式声明,否则抛出
ReferenceError -
this在非对象调用时为undefined(而非全局对象) - 禁止删除不可配置属性、八进制字面量(如
010)、重复参数名等
与普通函数的严格模式触发方式不同
普通函数需显式加"use strict"或处于已启用严格模式的上下文中;而异步函数无需任何标记,其函数体从词法解析阶段就被标记为严格模式代码。
- 即使写成
async function foo() { "use strict"; ... },第二行的指令也是冗余的 - 尝试在
async函数内用"use non-strict"无效(该指令本身不合法) - 箭头函数若被
async修饰(如const fn = async () => {...}),同样自动严格
实际影响:常见报错场景
开发者常因忽略这一点,在异步函数中写出非严格模式下“侥幸通过”的代码,结果运行时报错:
立即学习“Java免费学习笔记(深入)”;
-
async function bad() { undeclared = 42; }→ReferenceError: undeclared is not defined -
async function bad() { with({x:1}) { return x; } }→SyntaxError(解析阶段失败) -
async function bad(a, a) { }→SyntaxError: Duplicate parameter name not allowed in this context
兼容性与建议
所有支持async/await的引擎(Chrome 55+、Firefox 52+、Node.js 7.6+)均遵循该规范。无需额外适配,但应意识到:
- 迁移旧同步函数为
async时,检查隐式全局赋值、arguments.callee等严格模式禁用特性 - 不要试图绕过严格限制——这是设计使然,不是bug
- 工具链(如ESLint)通常默认按严格模式校验
async函数,无需额外配置










