严格模式是ECMAScript5 引入的,定义了一种不同的javascript解析方式。作用是,约束ECMAScript3下的一些不规范的行为。支持严格模式的浏览器: Internet Explorer 10 +、 Firefox 4+ Chrome 13+、 Safari 5.1+、 Opera 12+。
在严格模式下:
不允许使用未声明的变量:
"use strict";
x = 3.14; // 报错 (x 未定义)
x = 3.14; // 报错 (x 未定义)
不允许删除变量或对象。
"use strict";
var x = 3.14;
delete x; // 报错
var x = 3.14;
delete x; // 报错
"use strict";
var x = 010; // 报错
var x = 010; // 报错
不允许使用转义字符:
"use strict";
var x = \010; // 报错
var x = \010; // 报错
不允许对只读属性赋值:
"use strict";
var obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});
obj.x = 3.14; // 报错
var obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});
obj.x = 3.14; // 报错
变量名不能使用 "eval","arguments" 字符串:
"use strict";
var arguments = 3.14; // 报错
var eval = 3.14; // 报错
var arguments = 3.14; // 报错
var eval = 3.14; // 报错
禁止this关键字指向全局对象。
function f(){ return !this; } // 返回false,因为"this"指向全局对象,"!this"就是false function f(){ "use strict"; return !this; } // 返回true,因为严格模式下,this的值为undefined,所以"!this"为true。
因此,使用构造函数时,如果忘了加new,this不再指向全局对象,而是报错。
function f(){ "use strict"; this.a = 1; }; f();// 报错,this未定义