JavaScript 严格模式(use strict)
-
JavaScript Use Strict
"use strict"定义JavaScript代码应该以“严格模式”执行。"use strict"指令是ECMAScript第5版中的新指令。它不是一个语句,而是一个文字表达式,被早期版本的JavaScript忽略。"use strict"目的是表明代码应该以“严格模式”执行。例如,使用严格模式,您不能使用未声明的变量。除Internet Explorer 9及更低版本外,所有现代浏览器都支持"use strict":您可以在所有程序中使用严格模式。它可以帮助您编写更清晰的代码,例如阻止您使用未声明的变量。"use strict" 只是一个字符串,所以IE 9即使不理解它也不会抛出错误。
-
-
"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"; var x = 3.14; delete x; // 这将报错
不允许删函数。
尝试一下"use strict"; function x(p1, p2) {}; delete x; // 这将报错
不允许复制参数名称:
尝试一下"use strict"; function x(p1, p1) {}; // 这将报错
不允许使用八进制数字文字:
尝试一下"use strict"; function x(p1, p1) {}; // 这将报错
不允许写入只读属性:
尝试一下"use strict"; var obj = {}; Object.defineProperty(obj, "x", {value:0, writable:false}); obj.x = 3.14; // 这将报错
不允许写入get-only属性:
尝试一下"use strict"; var obj = {get x() {return 0} }; obj.x = 3.14; // 这将报错
不允许删除不可删除的属性:
尝试一下"use strict"; delete Object.prototype; // 这将报错
字符串“eval”不能用作变量:
尝试一下"use strict"; var eval = 3.14; // 这将报错
字符串“arguments”不能用作变量:
尝试一下"use strict"; var arguments = 3.14; // 这将报错
不允许使用with语句:
尝试一下"use strict"; with (Math){x = cos(2)}; // 这将报错
出于安全原因,不允许eval()在调用它的范围内创建变量:
尝试一下"use strict"; eval ("var x = 2"); alert (x); // 这将报错
在像f()这样的函数调用中,this值是全局对象。在严格模式下,它现在是未定义的。 -
JavaScript未来保留
为未来JavaScript版本保留的关键字不能在严格模式下用作变量名。这些是:- implements
- interface
- let
- package
- private
- protected
- public
- static
- yield
尝试一下"use strict"; var public = 1500; // 这将报错
小心!“use strict”指令仅在脚本或函数的开头被识别。