严格模式使得 JavaScript 对某些可能的问题抛出错误,而在非严格模式下,这些问题可能会被忽略。例如,未声明的变量(即全局变量)在非严格模式下会被隐式地创建为全局变量,而在严格模式下会抛出错误。(例子如下:)
非严格模式:
// 未声明的变量在非严格模式下不会抛出错误
var x = y; // y 未声明,但不会被报错严格模式:
"use strict";
// 严格模式下,未声明的变量会抛出错误
var x = y; // ReferenceError: y is not defined
在严格模式下,变量必须在使用之前声明。否则,会抛出引用错误。这有助于防止使用未声明的变量,从而减少潜在的错误(例子如下:)
非严格模式:
// 在使用变量之前未声明,在非严格模式下不会报错
function example() { x = 10; var x;
}
严格模式:
// 严格模式下,在使用变量之前未声明会抛出错误
"use strict";
function example() { x = 10; // ReferenceError: x is not defined var x;
}
在严格模式下,重复的属性名称或参数名称在对象字面量或函数参数列表中会导致语法错误。这有助于捕获可能的错误和不一致性。(例子如下:)
// 非严格模式下,重复的属性名称不会抛出错误
var obj = { a: 1, a: 2
};
console.log(obj.a); // 输出 2// 严格模式下,重复的属性名称会抛出错误
"use strict";
var obj = { a: 1, a: 2 // SyntaxError: Duplicate data property in object literal not allowed in strict mode
};
在严格模式下,函数声明必须在代码块的顶部,否则会导致语法错误。这有助于保持代码的可读性和一致性。(例子如下:)
非严格模式下,函数声明可以在代码块中间
if (true) { function example() { console.log("Hello"); }
}
example(); // 输出 "Hello"严格模式下,函数声明必须在代码块顶部
"use strict";
if (true) { function example() { // SyntaxError: Function declaration not allowed in strict mode console.log("Hello"); }
}
在严格模式下,this 关键字的值在函数调用时始终为 undefined(除非该函数是对象的方法)。这有助于减少关于 this 关键字行为的混淆。(例子如下:)
非严格模式下,函数内的this可能不指向全局对象
function example() { console.log(this);
}
example(); // 输出全局对象,通常是 window严格模式下,函数内的this在函数调用时始终为undefined
"use strict";
function example() { console.log(this); // undefined
}
example();
在严格模式下,尝试删除变量、函数或函数参数会抛出错误。这有助于防止意外地修改代码的状态。(例子如下:)
非严格模式下,可以删除变量
var x = 10;
delete x; // 在非严格模式下不会抛出错误,但x仍然存在严格模式下,尝试删除变量会抛出错误
"use strict";
var x = 10;
delete x; // TypeError: Cannot delete property 'x' of #<Object>
在严格模式下,八进制字面量会导致语法错误。这有助于防止使用可能导致混淆的八进制表示法。(例子如下:)
非严格模式下,八进制字面量有效
var num = 010; // 等于 8严格模式下,八进制字面量会抛出错误
"use strict";
var num = 010; // SyntaxError: Octal literals are not allowed in strict mode.
在严格模式下,eval() 函数的作用域限制在调用它的函数内部,而不是全局作用域。这有助于减少 eval() 函数可能带来的安全风险。(例子如下:)
非严格模式下,eval() 的作用域是全局作用域
var x = 20;
function testEval() { var x = 10; eval("console.log(x);"); // 输出 20,因为使用的是全局变量 x
}
testEval();严格模式下,eval() 的作用域限制在调用它的函数内部
"use strict";
var x = 20;
function testEval() { var x = 10; eval("console.log(x);"); // 输出 10,因为使用的是函数内部的 x
}
testEval();