## ES的幾個(gè)重要版本
-ES5 : 09年發(fā)布陋桂。
-ES6(ES2015) : 2015年發(fā)布岁歉,也稱為ECMA2015术羔。
-ES7(ES2016) : 2016年發(fā)布杨箭,也稱為ECMA2016? (變化不大)寞焙。
## 嚴(yán)格模式的理解
###概念
**理解**:除了正常運(yùn)行模式(混雜模式),ES5添加了第二種運(yùn)行模式:"嚴(yán)格模式"(strict mode)互婿。
顧名思義捣郊,這種模式使得Javascript在更嚴(yán)格的語法條件下運(yùn)行。
**目的**:
-消除Javascript語法的一些不合理慈参、不嚴(yán)謹(jǐn)之處呛牲,減少一些怪異行為
-消除代碼運(yùn)行的一些不安全之處,為代碼的安全運(yùn)行保駕護(hù)航
-為未來新版本的Javascript做好鋪墊
###使用
-針對(duì)整個(gè)腳本文件:將`use strict`放在腳本文件的第一行驮配,則整個(gè)腳本文件將以嚴(yán)格模式運(yùn)行娘扩。
-針對(duì)單個(gè)函數(shù):將`use strict`放在函數(shù)體的第一行,則整個(gè)函數(shù)以嚴(yán)格模式運(yùn)行壮锻。
PS:如果瀏覽器不支持琐旁,則這句話只解析為一條簡單的語句, 沒有任何副作用。
腳本文件的變通寫法:因?yàn)榈谝环N調(diào)用方法不利于文件合并猜绣,所以更好的做法是灰殴,借用第二種方法,將整個(gè)腳本文件放在一個(gè)立即執(zhí)行的匿名函數(shù)之中掰邢。
### 語法和行為改變
-必須用var聲明變量
-禁止自定義的函數(shù)中的this指向window
-對(duì)象不能有重名的屬性
## 嚴(yán)格模式和普通模式的區(qū)別
> 下面列舉幾條嚴(yán)格模式的內(nèi)容牺陶。
### 全局變量顯式聲明
在正常模式中,如果一個(gè)變量沒有聲明就賦值辣之,默認(rèn)是全局變量义图。嚴(yán)格模式禁止這種用法,全局變量必須顯式聲明召烂。
### 禁止this關(guān)鍵字指向全局對(duì)象:
```javascript
? ? ? ? var foo = function () {
? ? ? ? ? ? console.log(this);
? ? ? ? }
? ? ? ? foo();
```
上方代碼中碱工,普通模式打印的是window。嚴(yán)格模式下打印的是undefined奏夫。
### 構(gòu)造函數(shù)必須通過new實(shí)例化對(duì)象
構(gòu)造函數(shù)必須通過new實(shí)例化對(duì)象怕篷,否則報(bào)錯(cuò)。因?yàn)閠his為undefined酗昼,此時(shí)無法設(shè)置屬性廊谓。
比如說:
```
? ? ? ? var Cat = function (name) {
? ? ? ? ? ? this.name = name;
? ? ? ? }
? ? ? ? Cat('haha');
```
上方代碼中,如果在嚴(yán)格模式下麻削,則會(huì)報(bào)錯(cuò)蒸痹。
### 屬性相關(guān)
普通模式下春弥,如果對(duì)象有多個(gè)重名屬性,最后賦值的那個(gè)屬性會(huì)覆蓋前面的值叠荠。嚴(yán)格模式下匿沛,這屬于語法錯(cuò)誤。
普通模式下榛鼎,如果函數(shù)有多個(gè)重名的參數(shù)逃呼,可以用arguments[i]讀取。嚴(yán)格模式下者娱,多個(gè)重名的參數(shù)屬于語法錯(cuò)誤抡笼。
比如下面這樣的代碼:
```javascript
var obj = {
username: 'smyh';
username: 'vae'
}
```
上面的代碼,在嚴(yán)格模式下屬于語法錯(cuò)誤黄鳍,因?yàn)橛兄孛膶傩浴?/p>
### 函數(shù)必須聲明在頂層
將來Javascript的新版本會(huì)引入"塊級(jí)作用域"推姻。為了與新版本接軌,嚴(yán)格模式只允許在全局作用域或函數(shù)作用域的頂層聲明函數(shù)框沟。也就是說藏古,不允許在非函數(shù)的代碼塊內(nèi)聲明函數(shù)。
### 新增關(guān)鍵字
為了向?qū)鞪avascript的新版本過渡街望,嚴(yán)格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield校翔。