1.ES6 規(guī)定暫時(shí)性死區(qū)和let、const語句不出現(xiàn)變量提升,主要是為了減少運(yùn)行時(shí)錯(cuò)誤,防止在變量聲明前就使用這個(gè)變量,從而導(dǎo)致意料之外的行為。這樣的錯(cuò)誤在 ES5 是很常見的,現(xiàn)在有了這種規(guī)定,避免此類錯(cuò)誤就很容易了
一:不允許重復(fù)聲明
二:塊級(jí)作用域:ES6 引入了塊級(jí)作用域,明確允許在塊級(jí)作用域之中聲明函數(shù)
三:不存在變量提升
ES6在附錄B里面規(guī)定,瀏覽器的實(shí)現(xiàn)有自己的行為方式。
允許在塊級(jí)作用域內(nèi)聲明函數(shù)。
同時(shí),函數(shù)聲明還會(huì)提升到所在的塊級(jí)作用域的頭部。
考慮到環(huán)境導(dǎo)致的行為差異太大,應(yīng)該避免在塊級(jí)作用域內(nèi)聲明函數(shù)。如果確實(shí)需要,也應(yīng)該寫成函數(shù)表達(dá)式,而不是函數(shù)聲明語句
? ? ? ? ES6 的塊級(jí)作用域允許聲明函數(shù)的規(guī)則,只在使用大括號(hào)的情況下成立,如果沒有使用大括號(hào),就會(huì)報(bào)錯(cuò)。
3.do 表達(dá)式
{
? let t = f();
? t = t * t + 1;
}
上面代碼中,塊級(jí)作用域?qū)蓚€(gè)語句封裝在一起。但是,在塊級(jí)作用域以外,沒有辦法得到t的值,因?yàn)閴K級(jí)作用域不返回值,除非t是全局變量。
現(xiàn)在有一個(gè)提案,使得塊級(jí)作用域可以變?yōu)楸磉_(dá)式,也就是說可以返回值,辦法就是在塊級(jí)作用域之前加上do,使它變?yōu)閐o表達(dá)式。
let x = do {
? let t = f();
? t * t + 1;
};
上面代碼中,變量x會(huì)得到整個(gè)塊級(jí)作用域的返回值。
4. const 命令
const聲明一個(gè)只讀的常量。一旦聲明,常量的值就不能改變。
const PI = 3.1415;
PI // 3.1415
PI = 3;
// TypeError: Assignment to constant variable.
const聲明的變量不得改變值,這意味著,const一旦聲明變量,就必須立即初始化,不能留到以后賦值。
const的作用域與let命令相同:只在聲明所在的塊級(jí)作用域內(nèi)有效。
const命令聲明的常量也是不提升,同樣存在暫時(shí)性死區(qū),只能在聲明的位置后面使用。
const聲明的常量,也與let一樣不可重復(fù)聲明。
本質(zhì) §
const實(shí)際上保證的,并不是變量的值不得改動(dòng),而是變量指向的那個(gè)內(nèi)存地址不得改動(dòng)。對(duì)于簡(jiǎn)單類型的數(shù)據(jù)(數(shù)值、字符串、布爾值),值就保存在變量指向的那個(gè)內(nèi)存地址,因此等同于常量。但對(duì)于復(fù)合類型的數(shù)據(jù)(主要是對(duì)象和數(shù)組),變量指向的內(nèi)存地址,保存的只是一個(gè)指針,const只能保證這個(gè)指針是固定的,至于它指向的數(shù)據(jù)結(jié)構(gòu)是不是可變的,就完全不能控制了。因此,將一個(gè)對(duì)象聲明為常量必須非常小心。
const foo = {};
// 為 foo 添加一個(gè)屬性,可以成功
foo.prop = 123;
foo.prop // 123
// 將 foo 指向另一個(gè)對(duì)象,就會(huì)報(bào)錯(cuò)
foo = {}; // TypeError: "foo" is read-only
ES6 聲明變量的六種方法 § ?
ES5 只有兩種聲明變量的方法:var命令和function命令。ES6除了添加let和const命令,還有另外兩種聲明變量的方法:import命令和class命令。所以,ES6 一共有6種聲明變量的方法。
5.頂層對(duì)象的屬性
頂層對(duì)象,在瀏覽器環(huán)境指的是window對(duì)象,在Node指的是global對(duì)象。ES5之中,頂層對(duì)象的屬性與全局變量是等價(jià)的。
頂ES5之中,頂層對(duì)象的屬性與全局變量是等價(jià)的。頂層對(duì)象的屬性與全局變量掛鉤,ES6為了改變這一點(diǎn),一方面規(guī)定,為了保持兼容性,var命令和function命令聲明的全局變量,依舊是頂層對(duì)象的屬性;另一方面規(guī)定,let命令、const命令、class命令聲明的全局變量,不屬于頂層對(duì)象的屬性。也就是說,從ES6開始,全局變量將逐步與頂層對(duì)象的屬性脫鉤。
6.global 對(duì)象
瀏覽器里面,頂層對(duì)象是window,但 Node 和 Web Worker 沒有window。
瀏覽器和 Web Worker 里面,self也指向頂層對(duì)象,但是 Node 沒有self。
Node 里面,頂層對(duì)象是global,但其他環(huán)境都不支持。
很難找到一種方法,可以在所有情況下,都取到頂層對(duì)象。下面是兩種勉強(qiáng)可以使用的方法。
// 方法一
(typeof window !== 'undefined'
? ? window
? : (typeof process === 'object' &&
? ? ? typeof require === 'function' &&
? ? ? typeof global === 'object')
? ? ? global
? ? : this);
// 方法二
var getGlobal = function () {
? if (typeof self !== 'undefined') { return self; }
? if (typeof window !== 'undefined') { return window; }
? if (typeof global !== 'undefined') { return global; }
? throw new Error('unable to locate global object');
};