严格模式改变了哪些行为?

先理解原理和示例,再练习完整口述与追问。

严格模式禁止静默失败:未声明赋值、删除变量、重复参数、with、八进制字面量都会报错。函数里的 this 不再自动变成全局对象,arguments 不再和参数别名。ES Module、class 体默认是严格模式。

'use strict' 放在脚本或函数体开头才生效。它的目的是把原先静默造成全局变量或忽略失败的写法变成异常。给未声明的名字赋值抛 ReferenceError,而不是创建全局变量。delete 变量名、函数名抛 SyntaxError。对象字面量和函数参数不能重复。with 被禁止。012 这种八进制字面量被禁止,需要时用 0o12。

普通函数在非严格模式被直接调用时,this 是全局对象;严格模式下是 undefined。方法调用、call/apply、new 不受这条约定影响,该是谁还是谁。严格模式也让 eval 有独立作用域,不会往外层加变量。

整个 ES Module 都是严格模式,不能在模块里再选非严格。class 体、包括构造函数和方法,也是严格模式。从 CommonJS 迁到 ESM 时,依赖 this 指向 exports 或全局对象的老代码会坏掉。

js
function loose() { return this }
function strict() { 'use strict'; return this }
console.log(loose(), strict()) // 浏览器中是 window 和 undefined

function aliased(a) { 'use strict'; a = 2; return arguments[0] }
console.log(aliased(1)) // 1

严格模式不是“更快的模式”,引擎优化主要看代码形状,不要把它当成性能开关。包在立即执行函数里的严格模式不会影响外面的脚本。第三方老脚本如果依赖非严格的 this,不能只给整个页面乱加严格指令。

严格模式把几种静默错误改成直接报错:给未声明变量赋值、删除变量、重复参数、使用 with 和旧八进制都会失败。普通函数直接调用时 this 是 undefined,不会再变成 window;arguments 也不再和参数互相修改。ES Module 和 class 整体都是严格模式。它解决的是错误隔离,不是用来换性能的开关。