Javascript 严格模式
严格模式是在 ES5 中新增的指令,他不是一个声明,而是一个字面表达式,这样在老版本的浏览器中会被忽视而不至于会引起错误.
兼容版本
IE | Chrome | Firefox | Safari | Opera |
---|---|---|---|---|
10+ | 13+ | 4+ | 5.1+ | 12+ |
宣告严格模式
'use strict';
x = 3.14; // 进入严格模式这里会报错
严格模式需要在一段脚本或者函数的开头宣告才能被识别,在脚本开头这个脚本中的代码都将以严格模式执行,函数开头宣告则只有这个函数中的代码会进入严格模式.(类似 javascript 的函数作用域)
x = 3.14; // 这里不会报错,因为不是严格模式
myFunction();
function myFunction() {
'use strict';
y = 3.14; // 这里是严格模式会报错
}
严格模式中不允许的代码
-
变量未声明不可使用
'use strict'; x = 3.14; // x未声明所以报错
-
不可删除变量和函数
'use strict'; var x = 3.14; delete x; // 变量无法删除报错
'use strict'; function x() {} delete x; // 函数无法删除报错
-
不允许定义重复的形参
'use strict'; function x(p1, p1) {} // 形参重复报错
-
不支持八进制数字字面表达式
'use strict'; var x = 010; // 字面量八进制数报错
-
不允许转义字符
"use strict"; var x = \010; // 转义字符报错
-
不允许写只读属性
'use strict'; var obj = {}; Object.defineProperty(obj, 'x', { value: 0, writable: false }); obj.x = 3.14; // 只读不可写,报错
-
不允许写只能 get 的属性
'use strict'; var obj = { get x() { return 0; } }; obj.x = 3.14; // x属性之定义了getter,没有setter,报错
-
不允许删除一个不可删属性
'use strict'; delete Object.prototype; // prototype不可删,报错
-
eval 字符串不能作为变量名
'use strict'; var eval = 3.14; // eval不可定义为变量,报错
-
不能定义 arguments 变量
'use strict'; var arguments = 3.14; // 不能定义arguments变量,报错
-
不可使用 with
'use strict'; with (Math) { x = cos(2); } // 不可使用with,报错
-
出于安全原因考虑,eval 语句不允许创建变量
'use strict'; eval('var x = 2'); alert(x); // 报错,未定义
-
在严格模式的函数中的 this 将会变为 undefined 而不是 window 或者其他全局对象
'use strict'; function a() { console.log(this); } a(); // undefined
-
前瞻性考虑
严格模式中一些将来可能用到的新增关键字将不允许使用:
- implements
- interface
- let
- package
- private
- protected
- public
- static
- yield
注意事项
"use strict"必须在脚本或者函数的最上方定义,不然浏览器将不会解析为严格模式.