严格模式
最后更新于:2022-04-02 03:27:17
[TOC]
## 启用方法
```
'use strict';
```
### 脚本启动
```
```
### 单个函数
```
function strict() {
'use strict';
return '这是严格模式';
}
```
## 显式报错的情况
### 只读属性不可写
`'abc'.length = 5;
`
### 只设置了取值器的属性不可写
```
var obj = {
get v() { return 1; }
};
obj.v = 2;
```
### 禁止扩展的对象不可扩展
```
var obj = {};
Object.preventExtensions(obj);
obj.v = 1;
```
### eval、arguments 不可用作标识名
### 函数不能有重名的参数
### 禁止八进制的前缀0表示法
`var n = 0100;`
### 全局变量显式声明
`v = 1; // 报错,v未声明`
### 禁止 this 关键字指向全局对象
```
// 严格模式
function f() {
'use strict';
console.log(this === undefined);
//正常模式指向windows
}
f() // true
```
### 禁止删除变量
```
var x;
delete x; // 语法错误
var obj = Object.create(null, {
x: {
value: 1,
configurable: true
}
});
delete obj.x; // 删除成功
```
### 禁止使用 with 语句
```
var v = 1;
var obj = {};
with (obj) {
v = 2;
}
```
### 新增 eval 作用域
原先只有两种作用域 全局作用域和函数作用域, 严格模式新增`eval 作用域`
eval 作用域只能用在eval
```
(function () {
'use strict';
var x = 2;
console.log(eval('var x = 5; x')) // 5
console.log(x) // 2
})()
```
### 新增保留字
```
function package(protected) { // 语法错误
'use strict';
var implements; // 语法错误
}
```
';