严格模式干掉的是 JS 历史包袱:未声明就赋值的变量不再静默成为全局变量,而是直接抛 ReferenceError;对只读属性赋值、删除不可配置属性、函数参数重名都会报错;this 不再默认指向全局对象(普通函数里是 undefined);with 语句被禁用,arguments 也不再同步参数变化。它把大量「能跑但埋雷」的写法挡在编译期。
现代项目几乎天然处于严格模式:ES 模块(import/export)默认开启,class 内部默认开启,Babel、TypeScript、打包工具编译输出也都会自动加上。需要手动写的场景是业务老脚本。加在文件最顶部作用于全局脚本,加在函数内只作用于该函数——推荐后者,避免 concat 打包时牵连其他文件。
// 非严格模式:静默创建全局变量 function sloppy() { leaked = '我跑出去了'; } sloppy(); console.log(leaked); // 我跑出去了 // 严格模式:直接报错 'use strict'; function strict() { try { nope = '未声明'; } catch (e) { console.log(e.name); // ReferenceError } } strict(); // 严格模式下普通函数 this 为 undefined 'use strict'; function whatIsThis() { console.log(this); // undefined(非严格是 window/global) } whatIsThis(); // 参数重名也禁止 'use strict'; try { // function f(a, a) {} // SyntaxError } catch (e) { console.log('ok'); }