JavaScript 使用严格模式
"use strict";
定义 JavaScript 代码应该在 "严格模式" 下执行。
"use strict" 指令
"use strict"
指令是 ECMAScript 版本 5 中的新增内容。
它不是一个语句,而是一个文字表达式,早期的 JavaScript 版本会忽略它。
"use strict"
的目的是指示代码应该在 "严格模式" 下执行。
在严格模式下,例如,您不能使用未声明的变量。
所有现代浏览器都支持 "use strict",除了 Internet Explorer 9 及更低版本
指令 | |||||
---|---|---|---|---|---|
"use strict" | 13.0 | 10.0 | 4.0 | 6.0 | 12.1 |
表格中的数字指定了完全支持该指令的第一个浏览器版本。
您可以在所有程序中使用严格模式。它可以帮助您编写更干净的代码,例如防止您使用未声明的变量。
"use strict"
只是一个字符串,因此即使 IE 9 不理解它,也不会抛出错误。
声明严格模式
通过在脚本或函数的开头添加 "use strict"; 来声明严格模式。
在脚本开头声明,它具有全局作用域(脚本中的所有代码都将在严格模式下执行)
在函数内部声明时,它具有局部作用域(只有函数内部的代码处于严格模式)
x = 3.14; // 这不会导致错误。
myFunction();
function myFunction() {
"use strict";
y = 3.14; // 这将导致错误
}
亲自尝试 »
"use strict"; 语法
声明严格模式的语法旨在与旧版本的 JavaScript 兼容。
在 JavaScript 程序中编译数字字面量 (4 + 5;) 或字符串字面量 ("John Doe";) 没有副作用。它只是编译到一个不存在的变量并终止。
所以 "use strict";
仅对“理解”其含义的新编译器有效。
为什么要使用严格模式?
严格模式使编写“安全”的 JavaScript 变得更容易。
严格模式将以前接受的“不良语法”更改为真正的错误。
例如,在普通 JavaScript 中,将变量名拼写错误会创建一个新的全局变量。在严格模式下,这将抛出错误,从而使意外创建全局变量成为不可能。
在普通 JavaScript 中,开发人员不会收到任何错误反馈,无法为不可写属性分配值。
在严格模式下,对不可写属性、仅 getter 属性、不存在的属性、不存在的变量或不存在的对象的任何赋值都将抛出错误。
严格模式下不允许
不允许在未声明的情况下使用变量
"use strict";
x = 3.14; // 这将导致错误
对象也是变量。
不允许在未声明的情况下使用对象
"use strict";
x = {p1:10, p2:20}; // 这将导致错误
不允许删除变量(或对象)。
"use strict";
let x = 3.14;
delete x; // 这将导致错误
不允许删除函数。
"use strict";
function x(p1, p2) {};
delete x; // 这将导致错误
不允许重复参数名称
"use strict";
function x(p1, p1) {}; // 这将导致错误
不允许八进制数字字面量
"use strict";
let x = 010; // 这将导致错误
不允许八进制转义字符
"use strict";
let x = "\010"; // 这将导致错误
不允许写入只读属性
"use strict";
const obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});
obj.x = 3.14; // 这将导致错误
不允许写入仅 getter 属性
"use strict";
const obj = {get x() {return 0} };
obj.x = 3.14; // 这将导致错误
不允许删除不可删除的属性
"use strict";
delete Object.prototype; // 这将导致错误
不允许将单词 eval
用作变量
"use strict";
let eval = 3.14; // 这将导致错误
不允许将单词 arguments
用作变量
"use strict";
let arguments = 3.14; // 这将导致错误
不允许使用 with
语句
"use strict";
with (Math){x = cos(2)}; // 这将导致错误
出于安全原因,不允许 eval()
在调用它的作用域中创建变量。
在严格模式下,函数中的 this
关键字的行为有所不同。
this
关键字引用调用函数的对象。
如果未指定对象,则严格模式下的函数将返回 undefined
,而普通模式下的函数将返回全局对象 (window)
"use strict";
function myFunction() {
alert(this); // 将提醒 "undefined"
}
myFunction();
面向未来!
在严格模式下,不能将为将来 JavaScript 版本保留的关键字用作变量名。
它们是
- implements
- interface
- let
- package
- private
- protected
- public
- static
- yield
"use strict";
let public = 1500; // 这将导致错误
注意!
"use strict" 指令仅在脚本或函数的开头被识别。