1
0
mirror of https://github.com/Daotin/Web.git synced 2024-11-01 05:24:46 +08:00
Web-main/08-ES6语法/01-ES5严格模式.md
2020-12-30 11:39:04 +08:00

146 lines
3.6 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 一、ECMAScript 5 严格模式
### 1、概述
除了正常运行模式ECMAscript 5添加了第二种运行模式"严格模式"strict mode。顾名思义这种模式使得Javascript在更严格的条件下运行。
### 2、目的
- 消除Javascript语法的一些不合理、不严谨之处减少一些怪异行为;
- 消除代码运行的一些不安全之处,保证代码运行的安全;
- 提高编译器效率,增加运行速度;
- 为未来新版本的Javascript做好铺垫。
"严格模式"体现了Javascript更合理、更安全、更严谨的发展方向包括IE 10在内的主流浏览器都已经支持它许多大项目已经开始全面拥抱它。
另一方面,同样的代码,在"严格模式"中,可能会有不一样的运行结果;一些在"正常模式"下可以运行的语句,在"严格模式"下将不能运行。掌握这些内容有助于更细致深入地理解Javascript让你变成一个更好的程序员。
### 3、使用
1、将"use strict"放在脚本文件的第一行,则整个脚本都将以"严格模式"运行。**如果这行语句不在第一行,则无效,整个脚本以"正常模式"运行。**如果不同模式的代码文件合并成一个文件,这一点需要特别注意。
(严格地说,只要前面不是产生实际运行结果的语句,"use strict"可以不在第一行,比如直接跟在一个空的分号后面。)
```html
<script>
"use strict";
//...
</script>
```
2、针对单个函数
将"use strict"放在函数体的第一行,则整个函数以"严格模式"运行。
```js
function strict(){
"use strict";
return "这是严格模式。";
}
```
## 二、语法和行为改变
### 1、全局变量必须用var显示声明变量
在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种用法,全局变量必须显式声明。
```html
<script type="text/javascript">
"use strict";  
v = 1; // 报错v未声明
//name = "Daotin";
for (i = 0; i < 2; i++) { // 报错i未声明
}
</script>
```
> 不能使用 name因为 name 是window的一个保留属性默认为空。
### 2、禁止自定义的函数中的this指向window
```html
<script>
"use strict";  
function foo() {
console.log(this);
}
foo();
</script>
```
没有 "use strict" 的时候,打印 window对象有 "use strict" 的时候打印undefined。
### 3、严格模式会创建eval作用域
eval会解析语句中的字符串。
```html
<script>
"use strict";  
var name = 'Daotin';
eval('var name = "lvonve"; console.log(name)');
console.log(name);
</script>
```
如果不加 "use strict"; ,两次打印的结构都为 lvonve加了的话打印结果为 lvonve和Daotin。也就相当于给eval创建了一个作用域。
### 4、对象不能有重名的属性
正常模式下,如果对象有多个重名属性,最后赋值的那个属性会覆盖前面的值。严格模式下,这属于语法错误。
但是在浏览器console下面并没有显示错误信息。
```html
<script>
"use strict";  
var o = {    
p: 1,
p: 2  
}; // 语法错误
</script>
```
### 5、禁止删除变量
严格模式下无法删除变量。只有configurable设置为true的对象属性才能被删除。
```js
"use strict";
  var x;
  delete x; // 语法错误
  var o = Object.create(null, {'x': {
      value: 1,
      configurable: true
  }});
  delete o.x; // 删除成功
```