JavaScript 严格模式完全指南:'use strict' 的作用与注意事项
Introduction
JavaScript 严格模式(Strict Mode)是 ES5 引入的安全子集,通过 'use strict' 指令启用。在严格模式下,JavaScript 会禁用一些不安全和易出错的行为(如隐式全局变量、this 指向 window、arguments alias 等),让代码更规范、更易调试。本文讲解严格模式的触发方式、具体限制及注意事项。
启用严格模式
/* 方法1:全局启用(整个脚本文件)*/
'use strict';
var x = 10; // 严格模式生效
/* 方法2:函数级别启用(仅当前函数)*/
function strictFn() {
'use strict';
// 只有这里启用严格模式
y = 20; // 严格模式下报错:y is not defined
}
function mixedFn() {
// 这里是正常模式
z = 30; // 正常模式会创建全局变量 z
}
/* 方法3:模块(ES6 modules)自动启用严格模式 */
/* export default function() { ... } */
严格模式的主要限制
'use strict';
/* 1. 禁止隐式全局变量 */
x = 10; // ReferenceError: x is not defined
// 必须显式声明:var x = 10;
/* 2. 禁止删除不可配置属性 */
var obj = {};
Object.defineProperty(obj, 'x', { value: 1, configurable: false });
delete obj.x; // TypeError
/* 3. 禁止八进制字面量 */
var n = 010; // SyntaxError(严格模式禁止 0 开头的八进制)
/* 4. 禁止 with 语句 */
with (Math) { x = cos(2); } // SyntaxError
/* 5. arguments 不再是动态别名 */
function f(a) {
a = 99;
console.log(arguments[0]); // 非严格:99,严格:10(不受影响)
}
f(10);
this 在严格模式下的变化
'use strict';
function greet() {
console.log(this); // undefined(非严格模式下是 window)
}
/* 构造函数中的 this */
function Person(name) {
this.name = name; // 严格模式正常运行
}
var p = Person('小马'); // 严格模式报错(因为 Person 不是用 new 调用的)
// 非严格模式:this 指向 window,name 被赋值为全局变量
/* 事件处理函数中的 this */
document.addEventListener('click', function() {
console.log(this); // undefined(严格模式),非严格是 document
});
eval 与 arguments 限制
'use strict';
var evalVar = 10;
eval('var evalVar = 20;');
console.log(evalVar); // 10(eval 中声明的变量不会泄漏到外部)
/* arguments 形参分离 */
function f(a) {
arguments[0] = 99;
console.log(a); // 严格:10,非严格:99
}
f(10);
/* arguments.callee 禁用 */
function factorial(n) {
if (n <= 1) return 1;
return n * arguments.callee(n - 1); // TypeError:严格模式禁止 arguments.callee
}
常见问题
- 严格模式与 ES6 模块:ES6 模块自动处于严格模式,不需要手动加 'use strict'。
- 严格模式不兼容旧版 IE:IE9 及以下不支持,但现代浏览器都已支持,实际项目中放心使用。
- 'use strict' 位置:必须是脚本/函数的第一个语句,否则无效(单引号和双引号均可)。
- 全局严格模式影响第三方库:如果第三方库没有设计为严格模式,可能报错。建议在函数级别启用而非全局启用。
延伸阅读
- MDN 严格模式:MDN Strict Mode