JavaScript 严格模式
"use strict"; 定义 JavaScript 代码应该以"严格模式"执行。
"use strict" 指令
"use strict" 是 JavaScript 1.8.5 中的新指令(ECMAScript version 5)。
它不算一条语句,而是一段文字表达式,更早版本的 JavaScript 会忽略它。
"use strict"; 的作用是指示 JavaScript 代码应该以"严格模式"执行。
在严格模式中,您无法,例如,使用未声明的变量。
除Internet Explorer 9 及更低版本外,所有现代浏览器都支持"严格使用":
Directive | |||||
---|---|---|---|---|---|
"use strict" | 13.0 | 10.0 | 4.0 | 6.0 | 12.1 |
表中的数字指定完全支持该指令的第一个浏览器版本。
您可以在所有程序中使用严格模式。它帮助您编写更清晰的代码,比如防止您使用未声明的变量。
"use strict"
只是一个字符串,所以IE9即使不理解也不会抛出错误。
声明严格模式
通过在脚本或函数的开头添加 "use strict"; 来声明严格模式。
在脚本开头进行声明,拥有全局作用域(脚本中的所有代码均以严格模式来执行):
实例
myFunction();
function myFunction() {
y = 3.14; // 这也会导致错误 because y is not declared
}
在函数中声明严格模式,拥有局部作用域(只有函数中的代码以严格模式执行):
myFunction();
function myFunction() {
"use strict";
y = 3.14; // 这将导致错误
}
"use strict"; 语法
声明严格模式的语法被设计为兼容更早版本的 JavaScript。
编译 JavaScript 程序中的数值文字(比如 4+5)或字符串文字("Bill Gates")不会有负面效果。它只会编译为不存在的变量然后消失。
所有 "use strict"; 只会对"理解"其含义的新编译器产生影响。
为什么使用严格模式?
严格模式使我们更容易编写"安全的" JavaScript。
严格模式把之前可接受的"坏语法"转变为真实的错误。
举例来说,在普通的 JavaScript 中,错打变量名会创建新的全局变量。在严格模式中,此举将抛出错误,这样就不可能意外创建全局变量。
在普通 JavaScript 中,如果向不可写属性赋值,开发者不会得到任何错误反馈。
在严格模式中,向不可写的、只能读取的、不存在的属性赋值,或者向不存在的变量或对象赋值,将抛出错误。
严格模式中不允许的事项
在不声明变量的情况下使用变量,是不允许的:
x = 3.14; // 这将导致错误
对象也是变量
在不声明对象的情况下使用对象也是不允许的:
x = {p1:10, p2:20}; // 这将导致错误
删除变量(或对象)是不允许的:
var x = 3.14;
delete x; // 这将导致错误
删除函数是不允许的:
function x(p1, p2) {};
delete x; // 这将导致错误
重复参数名是不允许的:
function x(p1, p1) {}; // 这将导致错误
八进制数值文本是不允许的:
var x = 010; // 这将导致错误
转义字符是不允许的:
var x = "\010"; // 这将导致错误
写入只读属性是不允许的:
var obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});
obj.x = 3.14; // 这将导致错误
写入只能获取的属性是不允许的:
var obj = {get x() {return 0} };
obj.x = 3.14; // 这将导致错误
删除不可删除的属性是不允许的:
delete Object.prototype; // 这将导致错误
字符串 eval
不可用作变量:
var eval = 3.14; // 这将导致错误
字符串 arguments
不可用作变量:
var arguments = 3.14; // 这将导致错误
with 语句是不允许的:
with (Math){x = cos(2)}; // 这将导致错误
处于安全考虑,不允许 eval() 在其被调用的作用域中创建变量:
eval ("var x = 2");
alert (x); // 这将导致错误
函数中的 this
关键字在严格模式下的行为不同。
this
关键字指调用函数的对象。
如果未指定对象,则严格模式下的函数将返回 undefined
,而正常模式下的函数将返回全局 object (window):
function myFunction() {
alert(this); // 将提醒 "undefined"
}
myFunction();
对未来的保障
严格模式中不允许使用为未来预留的关键词。
它们是:
- implements
- interface
- let
- package
- private
- protected
- public
- static
- yield
var public = 1500; // 这将导致错误
警告!
"use strict" 指令只能在脚本或函数的开头被识别。