JavaScript严格模式
JavaScript 的严格模式是一种限制 JavaScript 的一部分用法,以提高代码质量和安全性的模式。在严格模式下,不允许使用一些以前的不安全的语法,同时还引入了一些新的限制和改进。
要在 JavaScript 文件或函数中启用严格模式,可以使用 "use strict" 指令。
"use strict";
"use strict" 指令在 JavaScript 1.8.5 (ECMAScript5) 中新增。
它不是一条语句,但是是一个字面量表达式,在 JavaScript 旧版本中会被忽略。
"use strict" 的目的是指定代码在严格条件下执行。
严格模式下你不能使用未声明的变量。
支持严格模式的浏览器:
Internet Explorer 10 +、Firefox 4+、 Chrome 13+、 Safari 5.1+、 Opera 12+。
严格模式对 JavaScript 引擎做了大量的改变。以下是一些主要的变化:
-
消除静默错误:严格模式下,JavaScript 会抛出更多的错误,而不是静默地忽略它们。例如,赋值给一个未声明的变量会抛出一个错误。
-
阻止一些不安全的操作:严格模式会阻止一些不安全的操作,比如删除不可删除的属性。
-
改变函数的行为:在严格模式下,函数的行为会发生一些变化。例如,通过
eval()
添加的变量不会出现在函数定义的作用域中。 -
改变
this
的行为:在严格模式下,函数内部的this
在没有明确指定的情况下不会默认指向全局对象,而是undefined
。 -
不允许重复的参数名:在严格模式下,函数参数不能有重复的名字,否则会抛出一个错误。
-
更多的保留字:严格模式下,一些以前的保留字(如
eval
和arguments
)在某些情况下会有更多的限制,不允许作为变量或函数名。
严格模式的限制以及相应的示例:
- 禁止使用未声明的变量
"use strict"; x = 10; // ReferenceError: x is not defined
- 禁止删除变量或函数
"use strict"; var x = 10; delete x; // SyntaxError: Delete of an unqualified identifier in strict mode.
- 禁止重复命名参数
"use strict"; function myFunction(a, a) { // SyntaxError: Duplicate parameter name not allowed in this context return a + a; }
- 禁止使用八进制表示法
"use strict"; var num = 010; // SyntaxError: Octal literals are not allowed in strict mode.
- 禁止使用 with 语句
"use strict"; var obj = { x: 10, y: 20 }; with (obj) { // SyntaxError: Strict mode code may not include a with statement console.log(x + y); }
- 严格模式中 this 的限制
"use strict"; function myFunction() { console.log(this); } myFunction(); // undefined
- 不允许使用转义字符:
"use strict"; var x = \010; // 报错
- 不允许对只读属性赋值:
"use strict"; var obj = {}; Object.defineProperty(obj, "x", {value:0, writable:false}); obj.x = 3.14; // 报错
- 不允许对一个使用getter方法读取的属性进行赋值
"use strict"; var obj = {get x() {return 0} }; obj.x = 3.14; // 报错
- 不允许删除一个不允许删除的属性:
"use strict"; delete Object.prototype; // 报错
保留关键字
为了向将来Javascript的新版本过渡,严格模式新增了一些保留关键字:
- implements
- interface
- let
- package
- private
- protected
- public
- static
- yield