千呼萬喚始出來-ES6的let和const命令

本文學(xué)自阮大神的 let和const命令,文章整理為精簡版。

一屋休、let命令

let所聲明的變量,只在let命令所在的代碼塊內(nèi)有效备韧。就不做過多介紹了劫樟。
下面通過for循環(huán)來簡要說明下let

 for (let i = 0; i < 10; i++) {
    a[i] = function () {
    console.log(i);
      };
   }
    a[6](); // 6

若for循環(huán)中使用var,則a6打印出來的為10织堂;
上面代碼中叠艳,變量i是let聲明的,當(dāng)前的i只在本輪循環(huán)有效易阳,所以每一次循環(huán)的i其實都是一個新的變量附较,所以最后輸出的是6。你可能會問潦俺,如果每一輪循環(huán)的變量i都是重新聲明的拒课,那它怎么知道上一輪循環(huán)的值,從而計算出本輪循環(huán)的值事示?這是因為 JavaScript 引擎內(nèi)部會記住上一輪循環(huán)的值早像,初始化本輪的變量i時,就在上一輪循環(huán)的基礎(chǔ)上進(jìn)行計算肖爵。


不存在變量提升

簡單一句話:若沒有l(wèi)et定義變量卢鹦,那么變量就是未定義的,它所聲明的變量一定要在聲明后使用劝堪,否則報錯冀自。

暫時性死區(qū)

簡單一句話:只要塊級作用域內(nèi)存在let命令揉稚,它所聲明的變量就“綁定”(binding)這個區(qū)域,不再受外部的影響凡纳。
總結(jié)為:在代碼塊內(nèi)窃植,使用let命令聲明變量之前,該變量都是不可用的荐糜。這在語法上巷怜,稱為“暫時性死區(qū)”(temporal dead zone,簡稱 TDZ)暴氏。

不允許重復(fù)性聲明

let不允許在相同作用域內(nèi)延塑,重復(fù)聲明同一個變量。

二答渔、塊級作用域

為什么需要塊級作用域

ES5 只有全局作用域函數(shù)作用域关带,沒有塊級作用域,這帶來很多不合理的場景沼撕。

  • 第一種場景宋雏,內(nèi)層變量可能會覆蓋外層變量。
  • 第二種場景务豺,用來計數(shù)的循環(huán)變量泄露為全局變量磨总。
ES6的塊級作用域

即代碼塊,不再贅述笼沥,記錄一點:塊級作用域的出現(xiàn)蚪燕,實際上使得獲得廣泛應(yīng)用的立即執(zhí)行函數(shù)表達(dá)式(IIFE)不再必要了。

塊級作用域與函數(shù)聲明

ES5 規(guī)定奔浅,函數(shù)只能在頂層作用域和函數(shù)作用域之中聲明馆纳,不能在塊級作用域聲明。
上面兩種函數(shù)聲明汹桦,根據(jù) ES5 的規(guī)定都是非法的鲁驶。
但是,瀏覽器沒有遵守這個規(guī)定舞骆,為了兼容以前的舊代碼灵嫌,還是支持在塊級作用域之中聲明函數(shù)。
關(guān)于ES6的塊級作用域與函數(shù)聲明這里要注意:ES6 引入了塊級作用域葛作,明確允許在塊級作用域之中聲明函數(shù)寿羞。但是考慮到環(huán)境導(dǎo)致的行為差異太大,應(yīng)該避免在塊級作用域內(nèi)聲明函數(shù)赂蠢。如果確實需要绪穆,也應(yīng)該寫成函數(shù)表達(dá)式,而不是函數(shù)聲明語句。

三玖院、const命令

  • const聲明一個只讀的常量菠红。一旦聲明,常量的值就不能改變难菌。
  • const聲明的變量不得改變值试溯,這意味著,const一旦聲明變量郊酒,就必須立即初始化遇绞,不能留到以后賦值
  • const的作用域與let命令相同:只在聲明所在的塊級作用域內(nèi)有效燎窘。
  • const命令聲明的常量也是不提升摹闽,同樣存在暫時性死區(qū),只能在聲明的位置后面使用褐健。
本質(zhì)

const實際上保證的付鹿,并不是變量的值不得改動,而是變量指向的那個內(nèi)存地址所保存的數(shù)據(jù)不得改動蚜迅。
對于簡單類型的數(shù)據(jù)(數(shù)值舵匾、字符串、布爾值)谁不,值就保存在變量指向的那個內(nèi)存地址纽匙,因此等同于常量。但對于復(fù)合類型的數(shù)據(jù)(主要是對象和數(shù)組)拍谐,變量指向的內(nèi)存地址,保存的只是一個指向?qū)嶋H數(shù)據(jù)的指針馏段,const只能保證這個指針是固定的(即總是指向另一個固定的地址)轩拨,至于它指向的數(shù)據(jù)結(jié)構(gòu)是不是可變的,就完全不能控制了院喜。因此亡蓉,將一個對象聲明為常量必須非常小心。

如果真的想將對象凍結(jié)喷舀,應(yīng)該使用Object.freeze方法砍濒。

ES6 聲明變量的六種方法

ES5 只有兩種聲明變量的方法:var命令和function命令。ES6 除了添加letconst命令硫麻,還有另外兩種聲明變量的方法:import命令class命令爸邢。所以,ES6 一共有 6 種聲明變量的方法拿愧。

四杠河、頂層對象的屬性

頂層對象,在瀏覽器環(huán)境指的是window對象,在 Node 指的是global對象券敌。ES5 之中唾戚,頂層對象的屬性與全局變量是等價的
頂層對象的屬性與全局變量掛鉤待诅,被認(rèn)為是 JavaScript 語言最大的設(shè)計敗筆之一,原因如下:

  • 沒法在編譯時就報出變量未聲明的錯誤叹坦,只有運行時才能知道(因為全局變量可能是頂層對象的屬性創(chuàng)造的,而屬性的創(chuàng)造是動態(tài)的)卑雁;
  • 程序員很容易不知不覺地就創(chuàng)建了全局變量(比如打字出錯).
  • 頂層對象的屬性是到處可以讀寫的募书,這非常不利于模塊化編程。

ES6 為了改變這一點序厉,一方面規(guī)定锐膜,為了保持兼容性,var命令和function命令聲明的全局變量弛房,依舊是頂層對象的屬性道盏;另一方面規(guī)定,let命令文捶、const命令荷逞、class命令聲明的全局變量,不屬于頂層對象的屬性粹排。也就是說种远,從 ES6 開始望艺,全局變量將逐步與頂層對象的屬性脫鉤莹桅。

五、global對象

ES5 的頂層對象砚蓬,本身也是一個問題射富,因為它在各種實現(xiàn)里面是不統(tǒng)一的膝迎。

  • 瀏覽器里面,頂層對象是window胰耗,但 Node 和 Web Worker 沒有window限次。
  • 瀏覽器和 Web Worker 里面,self也指向頂層對象柴灯,但是 Node 沒有self卖漫。
  • Node 里面,頂層對象是global赠群,但其他環(huán)境都不支持羊始。

同一段代碼為了能夠在各種環(huán)境,都能取到頂層對象查描,現(xiàn)在一般是使用this變量店枣,但是有局限性速警。

很難找到一種方法,可以在所有情況下鸯两,都取到頂層對象闷旧。下面是兩種勉強可以使用的方法。

// 方法一
(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');
};
如果你想更加深入理解const钧唐、let忙灼,請移步阮大神的官方博客,看完本章節(jié)的內(nèi)容钝侠,附帶看下文章末尾美麗的評論该园,看下大家的關(guān)注點在哪里。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末帅韧,一起剝皮案震驚了整個濱河市里初,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌忽舟,老刑警劉巖双妨,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異叮阅,居然都是意外死亡刁品,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門浩姥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挑随,“玉大人,你說我怎么就攤上這事勒叠《蛋ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵眯分,是天一觀的道長拌汇。 經(jīng)常有香客問我,道長颗搂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任幕垦,我火速辦了婚禮丢氢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘先改。我一直安慰自己疚察,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布仇奶。 她就那樣靜靜地躺著貌嫡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上岛抄,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天别惦,我揣著相機(jī)與錄音,去河邊找鬼夫椭。 笑死掸掸,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蹭秋。 我是一名探鬼主播扰付,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼仁讨!你這毒婦竟也來了羽莺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤洞豁,失蹤者是張志新(化名)和其女友劉穎盐固,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體族跛,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡闰挡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了礁哄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片长酗。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖桐绒,靈堂內(nèi)的尸體忽然破棺而出夺脾,到底是詐尸還是另有隱情,我是刑警寧澤茉继,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布咧叭,位于F島的核電站,受9級特大地震影響烁竭,放射性物質(zhì)發(fā)生泄漏菲茬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一派撕、第九天 我趴在偏房一處隱蔽的房頂上張望婉弹。 院中可真熱鬧,春花似錦终吼、人聲如沸镀赌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至良姆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間歇盼,已是汗流浹背舔痕。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留伯复,地道東北人邢笙。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓啸如,卻偏偏與公主長得像,于是被迫代替她去往敵國和親氮惯。 傳聞我的和親對象是個殘疾皇子叮雳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容