JavaScript 严格模式(use strict)

335 阅读3分钟

JavaScript 严格模式(use strict)


​ 顾名思义,js严格模式(use strict) 即在严格条件下运行的js代码。

使用"use strict" 指令

"use strict" 指令在javascript 1.8.5(ECMA Script)即ES5中新增。

"use strict" 它不是一条语句,但是是一个字面量表达式,在javascript旧版本中会被忽略。

"use strict" 的目的是将指定代码在严格模式下执行。

"use strict" 指令只允许出现在JS文件或函数的开头

目前支持严格模式的浏览器

浏览器 是否支持
Internet Explorer 10+ ✅ 是
FireFox 4+ ✅ 是
Chrome 13+ ✅ 是
Safari 5.1+ ✅ 是
Opera 12+ ✅ 是

严格模式的申明

严格模式通过在脚本或函数的头部添加 "use strict" 来表示申明。

"use strict";
a = 'brian'; // 严格模式下执行会报错,a未定义

> Uncaught ReferenceError: a is not defined
"use strict";
testFunction();
function testFunction() {
  a = "brian" // 严格模式下执行会报错,a未定义
}

函数内部申明严格模式

只会在函数中起效

a = "Brian";
testFunction();
function testFunction() {
  "use strict";
  b = "Hi."; // 函数内严格模式下执行会报错,b未定义。
}

经过上面的示例,我们已经了解严格模式的作用了,那为什么要使用严格模式?

消除js语法的一些不合理,不严谨,减少怪异的行为;

  1. 消除代码运行的一些不安全,保证代码运行的安全
  2. 提高编译效率,增加运行速度(这里可以了解JS变量解析方式)
  3. 在新的ES系列(ES6+)已经全面遵循严格模式

严格模式的限制

限制模式 示例代码(不允许的错误示例)
不允许使用未经申明的变量(包含对象) "use strict";
a='brian';
b={test: 1}
不允许删除变量和对象 "use strict";
var a='brian';
delete a;
不允许删除函数 "use strict";
function a(){};
delete a;
不允许变量重名 "use strict";
function a(p,p){};
不允许使用八进制 "use strict";
var a = 010;
不允许使用转义字符 "use strict";
var a = \010
不允许对只读数据赋值 "use strict";
var obj = {};
Object.defineProperty(obj, "a", {value: 'readonly', writable: false});
obj.a = "brian"
不允许对一个使用的getter方法读取的值进行赋值 "use strict";
var obj = {get a() {return "brian"}};
obj.a = "Hi.";
不允许删除一个不允许删除的属性 "use strict";
delete Object.prototype
不允许对变量命名使用特殊字符 eval,arguments 关键字 "use strict";
var eval = "brian";
var arguments = "brian";
不允许是用with(Math) 语句 "use strict";
with(Math){x=cos(2)}
不允许使用eval中定义的变量调用(安全原因) "use strict";
eval("var a = 'brian';");
alert(a)
禁止this 关键字指向全局对象 "use strict";
function a() {return this;}

1. 不允许使用未经申明的变量(包含对象)

2. 不允许删除变量和对象

3. 不允许删除函数

4. 不允许变量重名

5. 不允许使用八进制

6. 不允许使用转义字符

7. 不允许对只读数据赋值

8. 不允许对一个使用的getter方法读取的值进行赋值

9. 不允许删除一个不允许删除的属性

10. 不允许对变量命名使用特殊字符 eval,arguments关键字

11. 不允许是用with(Math) 语句

12. 不允许使用eval中定义的变量调用(安全原因)

13. 禁止this 关键字指向全局对象

保留的关键字

关键字 说明
implements -
interface -
let ES6 新增特性 用来申明变量
package -
private -
protected -
public -
static -
yield 同步调用