ECMAScript 5中引入的JavaScript严格模式是选择加入 JavaScript受限变体的一种方式。
严格模式不仅仅是一个子集:它有意地具有与普通代码不同的语义。
严格模式使编写“安全” JavaScript更加容易。
严格模式将以前接受的“错误语法”更改为实际错误。
在严格模式下,例如,您不能使用未声明的变量。
调用严格模式
严格模式是通过"use strict";在脚本或函数的开头添加来声明的。
要为整个脚本调用严格模式,在任何其他任何声明之前,输入语句“use strict” ::
"use strict";
str = "嗨,我是严格模式脚本!"; // 导致错误,因为未声明str
要为函数调用严格模式,请将确切的语句"use strict";放在函数的主体中,然后放在其他任何语句之前:
function myFunc() {
// 函数级严格模式语法
"use strict";
str = "大家好,我是严格模式函数!"; // 这将导致一个错误
return str;
}
严格模式可以帮助您编写更简洁的代码,例如防止使用未声明的变量。
该"use strict"指令只能在脚本或函数的开头识别。
单引号和双引号语法都是可以接受的('use strict';或"use strict";)。
严格模式下的常见限制
如您所知,在严格模式下,必须声明所有变量。
如果将值分配给不是声明变量的标识符,则将引发ReferenceError:
"use strict";
x = 5; // ReferenceError: x 没有定义
不允许使用未声明的对象(对象也是变量):
"use strict";
coord = {x:10, y:20}; // ReferenceError: coord 没有定义
在严格模式下,如果尝试删除变量,则会抛出语法错误:
"use strict";
var msg = "Hello World";
delete msg;// SyntaxError
同样,当您尝试在严格模式下删除函数时,会出现语法错误:
"use strict";
function sum(a, b) {
return a + b;
}
delete sum;// SyntaxError
在严格模式下,不允许重复参数名称:
"use strict";
function square(a, a) { // SyntaxError
return a * a;
}
在严格模式下,不允许写入只读属性:
"use strict";
var person = {name: "Akash", age: 22};
Object.defineProperty(person, "gender", {value: "male", writable: false});
person.gender = "female"; // TypeError
在严格模式下,不允许使用with语句:
"use strict";
with (Math){x = sqrt(25)}; // SyntaxError
在严格模式下,不允许使用八进制数字:
"use strict";
var x = 010; // SyntaxError
出于安全原因,eval()不允许在调用它的范围内创建变量:
"use strict";
eval("var x = 10;");
console.log(x); // ReferenceError: x 变量没有定义
字符串“eval”不能用作标识符(变量名):
"use strict";
var eval = "nhooo.com";// SyntaxError
字符串“arguments”不能用作标识符(变量名):
"use strict";
var arguments = "nhooo.com";// SyntaxError
为将来的ECMAScript版本铺平道路
将来的ECMAScript版本可能会引入新的语法,ES5中的严格模式会应用一些限制以简化过渡。
如果在严格模式中禁止这些更改的基础,则更容易进行一些更改。
在严格模式下,以下标识符列表成为保留关键字:
-
implements
-
interface
-
let
-
package
-
private
-
protected
-
public
-
static
-
yield
"use strict";
var package = true; // This will cause an error