JS 严格模式

由 "use strict"; 定义 JS 代码必须在严格条件下执行。比如,你不能使用未声明的变量。

"use strict" 指令在 JavaScript 1.8.5 (ECMAScript5) 中新增,在 JS 旧版本中会被忽略。

JS - "use strict" 指令

  • 脚本开头进行声明,全局作用域
  • 函数中声明,局部作用域

实例一,全局作用域中,变量未定义将报错:

"use strict";
x = 100;      // 报错 (x 未定义)

实例二,全局作用域中,函数内变量未定义将报错 :

"use strict";
abc();      	
function abc(){
	y = 200;    // 报错 (y 未定义)
}

实例三,局部作用域中,函数外变量未定义能使用,函数内变量未定义不能使用 :

x = 100;     
abc();      	
function abc(){
	"use strict";
	y = 200;    // 报错 (y 未定义)
}

实例四,不能删除变量或对象 :

"use strict";
var x = 100;
delete x;                 // 这将引发错误

实例五,不能删除函数 :

"use strict";
function abc(p1, p2) {}; 
delete abc;               // 报错

实例六,不能有重复参数名 :

"use strict";
function abc(p1, p1) {};  // 报错

实例七,不能有八进制数值文本 :

"use strict";
var i = 010;             // 错误

实例八,不能有转义字符 :

"use strict";
var i = \010;            // 错误

实例九,不能写入只读属性 :

"use strict";
var obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});

obj.x = 3.14;            // 错误

实例十,不能写入只能获取的属性 :

"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 的值是全局对象。在严格模式中,现在它成为了 undefined。

JS - 保留关键字

严格模式中不能使用为未来预留的关键词:

  • implements
  • interface
  • let
  • package
  • private
  • protected
  • public
  • static
  • yield
"use strict";
var public = 1500;      // 报错