JavaScript 严格模式
在JavaScript的发展过程中,为了保持对老代码的兼容性,许多早期的设计缺陷和不严谨的特性一直被保留下来。然而,这些特性可能导致代码中出现隐蔽的 错误或安全问题。为了解决这个问题,ECMAScript 5 引入了"严格模式"(Strict Mode),它是一种特殊的执行模式,让JavaScript代码运行在更严格的环境中。
什么是严格模式?
严格模式是JavaScript的一种受限制的变体,它故意与普通JavaScript有所不同。严格模式通过以下方式改变JavaScript的语义:
- 将一些JavaScript静默错误转为明显的异常
- 修复了一些导致JavaScript引擎难以优化的缺陷
- 禁用了一些在未来ECMAScript版本中可能被定义的语法
如何启用严格模式
有两种方式可以启用严格模式:
1. 脚本级严格模式
在脚本的最顶部添加 "use strict"
或 'use strict'
声明,整个脚本将以严格模式执行:
"use strict";
// 以下代码将在严格模式下执行
var x = 10;
console.log(x); // 10
2. 函数级严格模式
在函数体的开头添加 "use strict"
声明,只有该函数内的代码会在严格模式下执行:
function strictFunction() {
"use strict";
// 此函数内的代码在严格模式下执行
return "I'm in strict mode";
}
function normalFunction() {
// 此函数在非严格模式下执行
return "I'm in normal mode";
}
console.log(strictFunction()); // "I'm in strict mode"
console.log(normalFunction()); // "I'm in normal mode"
注意
不要在代码中间启用严格模式,这样做可能导致不可预测的行为。严格模式声明应该始终出现在脚本或函数的开头。
严格模式的主要限制和变化
1. 禁止使用未声明的 变量
在非严格模式下,如果你不小心漏掉了 var
、let
或 const
声明,JavaScript 会创建一个全局变量:
// 非严格模式
function nonStrict() {
x = 10; // 没有声明就使用x
console.log(x); // 10
}
nonStrict();
console.log(x); // 10 (x成为了全局变量)
而在严格模式下:
// 严格模式
function strict() {
"use strict";
x = 10; // 未声明变量
console.log(x);
}
// 运行结果: ReferenceError: x is not defined
2. 禁止删除变量、函数和不可删除的属性
"use strict";
var x = 10;
delete x; // SyntaxError
function y() {}
delete y; // SyntaxError
delete Object.prototype; // TypeError
3. 函数 参数必须唯一
在非严格模式下,重复的函数参数会默认使用最后一个参数值。而在严格模式下,这将导致语法错误:
// 非严格模式
function sum(a, a, c) {
return a + a + c; // 这里的a是第二个a参数
}
console.log(sum(1, 2, 3)); // 7 (2+2+3)
// 严格模式
"use strict";
function sum(a, a, c) { // SyntaxError: Duplicate parameter name not allowed in this context
return a + a + c;
}