2020-02-03
概述
ECMAScript 5的严格模式(strict mode)是采用具有限制性JavaScript变体的一种方式,使代码区别于正常模式(或非严格模式)(sloppy mode),形成与正常代码不同的语义。
意义
设立"严格模式"的目的,主要有以下几个:
- 严格模式通过抛出错误来消除了一些原有静默错误。
- 严格模式修复了一些导致 JavaScript引擎难以执行优化的缺陷:有时候,相同的代码,严格模式可以比非严格模式下运行得更快。
- 严格模式禁用了在ECMAScript的未来版本中可能会定义的一些语法, 为未来新版本的Javascript做好铺垫。
启用标识
"use strict"(或'use strict')
严格模式有效作用域
严格模式可以应用到整个脚本的全局范围内或函数中,在封闭大括弧 {} 内启用严格模式是无效的。
// 在封闭大括弧 {} 内启用严格模式是无效的
{
'use strict'
// some code here
}
调用严格模式
为脚本开启严格模式
为整个脚本文件开启严格模式,需要在所有代码语句前启用标识。严格地说,只要前面不是产生实际运行结果的语句,"use strict"可以不在第一行,比如直接跟在一个空的分号后面。
// 整个脚本都开启严格模式
'use strict';
// some code here
为函数开启严格模式
将"use strict"放在函数体的第一行,则整个函数以"严格模式"运行
function strict(){
"use strict";
return "这是严格模式。";
}
function notStrict() {
return "这是正常模式。";
}
非严格模式到严格模式的区别
- 禁止八进制语法:var n = 023和var s = “\047”
- 禁止with语句
- 禁止delete删除一个变量名(而不是属性名):delete myVariable
- 禁止使用未来保留字(也许会在ECMAScript 6中使用):implements, interface, let, package,
private, protected, public, static,和yield作为变量名或函数名 - 禁止对象字面量中使用两个相同的属性名:{a: 1, b: 3, a: 7}
- 给一个未声明的变量赋值
在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式下,全局变量必须显式声明。
"use strict";
// 假如有一个全局变量叫做a
aa = 17; // 因为变量名拼写错误
// 正常模式:自动创建一个新的aa全局变量
// 严格模式:抛出 ReferenceError
- 禁止this关键字指向全局对象
function f(){
return this;
}
// 返回false,因为"this"指向全局对象
function f(){
"use strict";
return this;
}
// 返回true,因为严格模式下,this的值为undefined
因此,使用构造函数时,如果忘了加new,this不再指向全局对象,而是报错。
function f(){
"use strict";
this.a = 1;
};
f();// 报错,this未定义
- 创设eval作用域
正常模式下,Javascript语言有两种变量作用域:全局作用域和函数作用域。严格模式创设了第三种作用域:eval作用域。正常模式下,eval语句的作用域,取决于它处于全局作用域,还是处于函数作用域。严格模式下,eval语句本身就是一个作用域,不再能够生成全局变量了,它所生成的变量只能用于eval内部。
"use strict";
let x = 2;
console.log(eval("let x = 5; x")); // 5
console.log(x); // 2
以上列举的是常见的区别,更多区别详见参考链接