1.ES6 規(guī)定暫時性死區(qū)和let、const語句不出現(xiàn)變量提升拣帽,主要是為了減少運行時錯誤赵刑,防止在變量聲明前就使用這個變量唉堪,從而導致意料之外的行為模聋。這樣的錯誤在 ES5 是很常見的,現(xiàn)在有了這種規(guī)定唠亚,避免此類錯誤就很容易了
一:不允許重復聲明
二:塊級作用域:ES6 引入了塊級作用域链方,明確允許在塊級作用域之中聲明函數(shù)
三:不存在變量提升
ES6在附錄B里面規(guī)定,瀏覽器的實現(xiàn)有自己的行為方式灶搜。
允許在塊級作用域內聲明函數(shù)祟蚀。
同時,函數(shù)聲明還會提升到所在的塊級作用域的頭部割卖。
考慮到環(huán)境導致的行為差異太大前酿,應該避免在塊級作用域內聲明函數(shù)。如果確實需要鹏溯,也應該寫成函數(shù)表達式罢维,而不是函數(shù)聲明語句
? ? ? ? ES6 的塊級作用域允許聲明函數(shù)的規(guī)則,只在使用大括號的情況下成立丙挽,如果沒有使用大括號肺孵,就會報錯。
3.do 表達式
{
? let t = f();
? t = t * t + 1;
}
上面代碼中颜阐,塊級作用域將兩個語句封裝在一起平窘。但是,在塊級作用域以外凳怨,沒有辦法得到t的值瑰艘,因為塊級作用域不返回值,除非t是全局變量猿棉。
現(xiàn)在有一個提案磅叛,使得塊級作用域可以變?yōu)楸磉_式屑咳,也就是說可以返回值萨赁,辦法就是在塊級作用域之前加上do,使它變?yōu)閐o表達式兆龙。
let x = do {
? let t = f();
? t * t + 1;
};
上面代碼中杖爽,變量x會得到整個塊級作用域的返回值敲董。
4. const 命令
const聲明一個只讀的常量。一旦聲明慰安,常量的值就不能改變腋寨。
const PI = 3.1415;
PI // 3.1415
PI = 3;
// TypeError: Assignment to constant variable.
const聲明的變量不得改變值,這意味著化焕,const一旦聲明變量萄窜,就必須立即初始化,不能留到以后賦值撒桨。
const的作用域與let命令相同:只在聲明所在的塊級作用域內有效查刻。
const命令聲明的常量也是不提升,同樣存在暫時性死區(qū)凤类,只能在聲明的位置后面使用穗泵。
const聲明的常量,也與let一樣不可重復聲明谜疤。
本質 §
const實際上保證的佃延,并不是變量的值不得改動,而是變量指向的那個內存地址不得改動夷磕。對于簡單類型的數(shù)據(jù)(數(shù)值履肃、字符串、布爾值)坐桩,值就保存在變量指向的那個內存地址榆浓,因此等同于常量。但對于復合類型的數(shù)據(jù)(主要是對象和數(shù)組)撕攒,變量指向的內存地址陡鹃,保存的只是一個指針,const只能保證這個指針是固定的抖坪,至于它指向的數(shù)據(jù)結構是不是可變的萍鲸,就完全不能控制了。因此擦俐,將一個對象聲明為常量必須非常小心脊阴。
const foo = {};
// 為 foo 添加一個屬性,可以成功
foo.prop = 123;
foo.prop // 123
// 將 foo 指向另一個對象蚯瞧,就會報錯
foo = {}; // TypeError: "foo" is read-only
ES6 聲明變量的六種方法 § ?
ES5 只有兩種聲明變量的方法:var命令和function命令嘿期。ES6除了添加let和const命令,還有另外兩種聲明變量的方法:import命令和class命令埋合。所以备徐,ES6 一共有6種聲明變量的方法。
5.頂層對象的屬性
頂層對象甚颂,在瀏覽器環(huán)境指的是window對象蜜猾,在Node指的是global對象秀菱。ES5之中,頂層對象的屬性與全局變量是等價的蹭睡。
頂ES5之中衍菱,頂層對象的屬性與全局變量是等價的。頂層對象的屬性與全局變量掛鉤,ES6為了改變這一點肩豁,一方面規(guī)定脊串,為了保持兼容性,var命令和function命令聲明的全局變量清钥,依舊是頂層對象的屬性洪规;另一方面規(guī)定,let命令循捺、const命令斩例、class命令聲明的全局變量,不屬于頂層對象的屬性从橘。也就是說念赶,從ES6開始,全局變量將逐步與頂層對象的屬性脫鉤恰力。
6.global 對象
瀏覽器里面叉谜,頂層對象是window,但 Node 和 Web Worker 沒有window踩萎。
瀏覽器和 Web Worker 里面停局,self也指向頂層對象,但是 Node 沒有self香府。
Node 里面董栽,頂層對象是global,但其他環(huán)境都不支持企孩。
很難找到一種方法锭碳,可以在所有情況下,都取到頂層對象勿璃。下面是兩種勉強可以使用的方法擒抛。
// 方法一
(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');
};