ES6中的let和const

let命令

ES6新增了 let命令瓶摆,用來聲明變量。它的用法類似于var馍驯,當(dāng)然也只是類似阁危,說明它還有其他不同于var的地方,那我們就來看下有哪些不同的地方汰瘫。

  • let的聲明的變量只在塊級(jí)作用域內(nèi)有效
    我們知道ES5只有全局作用域和函數(shù)作用域狂打,這會(huì)帶來行風(fēng)多不合理的場(chǎng)景,比如內(nèi)層變量可能會(huì)覆蓋外層變量:
var tmp = new Date();

function f() {
  console.log(tmp);
  if (false) {
    var tmp = 'hello world';
  }
}

f(); // undefined

上面代碼的的原意是混弥,在f()里打印外層作用域里的變量tmp趴乡,條件語句里也是打算使用外層作用域里的變量tmp,但是由于沒有塊級(jí)作用域蝗拿,f()里的tmp實(shí)際上是函數(shù)作用域內(nèi)if代碼塊里變量提升的tmp晾捏,所以打印的是undefined。這時(shí)如果將var tmp = 'hello world';里的var換成let就可以達(dá)到原來的目的:

image.png

從這里我們也可以看出let聲明與var聲明的另一個(gè)不同之處

  • 變量提升哀托?不存在的
    我們知道通過var聲明的變量惦辛,在作用域內(nèi)先于聲明語句之前對(duì)變量進(jìn)行使用而不會(huì)報(bào)錯(cuò)(值為undefined),這是因?yàn)樽兞刻嵘臋C(jī)制(JavaScript引擎在執(zhí)行一段代碼的時(shí)候仓手,會(huì)把所有變量的聲明都提升到當(dāng)前作用域的最前面胖齐。),但這種現(xiàn)象多少有些奇怪嗽冒,所以為了糾正這種現(xiàn)象let命令改變了語法行為呀伙,它使得凡是由它聲明出來的變量必須在聲明之后才能使用,否則報(bào)錯(cuò)添坊。也就是由let聲明的變量不會(huì)再被提升了:
image.png
  • 不允許重復(fù)聲明
    let不允許在相同作用域內(nèi)剿另,重復(fù)聲明同一個(gè)變量。
// 報(bào)錯(cuò)
!function () {
  let a = 10;
  var a = 1;
}()

// 報(bào)錯(cuò)
!function () {
  let a = 10;
  let a = 1;
}()

// 報(bào)錯(cuò)
!function () {
  var a = 10;
  let a = 1;
}()

上面三段代都會(huì)報(bào)錯(cuò)Uncaught SyntaxError: Identifier 'a' has already been declared贬蛙,只要涉及到let聲明某個(gè)變量摩钙,在同一作用域內(nèi)重復(fù)聲明該變量都會(huì)報(bào)錯(cuò)齐帚,不管重復(fù)的聲明是怎樣方式疏日。

  • 塊級(jí)作用域里的let聲明會(huì)形成一段“暫時(shí)性死區(qū)”
    只要塊級(jí)作用域內(nèi)存在let命令欲账,它所聲明的變量就“綁定”(binding)這個(gè)塊級(jí)區(qū)域五鲫,不再受外部的影響溺职。該塊級(jí)作用域的起始到let tmp='abc'這條語句之間的區(qū)域就稱為“暫時(shí)性死區(qū)”,因?yàn)檫@段區(qū)域內(nèi)對(duì)只要使用tmp變量就會(huì)報(bào)錯(cuò),即使外部作用域已經(jīng)聲明過tmp也不例外浪耘,這就是所謂的“不受外部影響”乱灵。
image.png

image.png

有了這個(gè)暫時(shí)性死區(qū)之后意味著typeof不再是一個(gè)百分百安全的運(yùn)算符了,在變量的死區(qū)內(nèi)對(duì)變量進(jìn)行typeof運(yùn)算也會(huì)報(bào)錯(cuò)七冲。

let命令與var命令的不同之處就是這些了:let的聲明的變量只在塊級(jí)作用域內(nèi)有效痛倚、let聲明的變量不會(huì)被提升let聲明的變量在同一作用域內(nèi)不能重復(fù)聲明澜躺、let聲明的變量會(huì)形成一段該變量的暫時(shí)性死區(qū)蝉稳。
下面舉個(gè)相比于varlet更方便的例子掘鄙,我記得在《高程》上有類似下面的一個(gè)例子:

var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[k](); //k為0到9, 10

造成這個(gè)結(jié)果的原因是耘戚,i是由var聲明的,由于i的變量提升一級(jí)不存在塊級(jí)作用域操漠,那么i在全局范圍都有效收津,于是每一次循環(huán)中的i從始至終都是指向的全局的那唯一一個(gè)i,所以循環(huán)結(jié)束后浊伙,所有的i的值都是10撞秋,因?yàn)樗麄兌际峭粋€(gè)i
《高程》上給的解決方案是將上面a[i]后面的賦值放在一個(gè)立即執(zhí)行表達(dá)式里返回出來嚣鄙,模仿出一個(gè)塊級(jí)作用域讓每次循環(huán)都新建出一個(gè)新的i以達(dá)到每個(gè)i是次當(dāng)次循環(huán)的索引值的結(jié)果吻贿。
那現(xiàn)在有了let聲明,使用立即執(zhí)行表達(dá)式來模擬塊作用域這樣麻煩的方法便可由let來代替了拗慨,所以對(duì)于上面的代碼廓八,我們只需要將var i=0改為let i = 0就行了,僅僅一點(diǎn)點(diǎn)改動(dòng)就完全達(dá)到我們想要目的:

image.png

使用var i=0let i=0的區(qū)別就是:前者沒有塊級(jí)作用域赵抢,所有的i從始至終都指向同一個(gè)i剧蹂;而后者每次循環(huán)都生成一個(gè)塊級(jí)作用域且在該作用域內(nèi)聲明一個(gè)新的i,所以每個(gè)i的都是不同的i烦却,基本原理大概就如同下面這個(gè)簡單例子:
image.png

好了宠叼,說完了let該說const了,雖然const可以一筆帶過的其爵,但還是給它一個(gè)新的標(biāo)題吧冒冬。

const命令

上面列舉的那些,let有的const都有摩渺,所以這部分不用再贅述简烤。直接說與let不同的地方

  • const聲明的同時(shí)必須被初始化
image.png

喏,如果不初始化會(huì)報(bào)錯(cuò)摇幻,提醒你初始化

  • const聲明的變量初始化后不能再被賦予其他的值
    那這個(gè)值指的是什么呢横侦?看兩個(gè)例子:

image.png

嗯挥萌,這不是很正常嘛,企圖改變const聲明的變量的值時(shí)就報(bào)錯(cuò)

image.png

咦枉侧,不是說不能改變值么引瀑?這,不對(duì)啊榨馁。好吧憨栽,其實(shí)這不是正常的操作,下面的才是
image.png

所以這下我們應(yīng)該能猜到翼虫, const聲明的變量初始化后不能再被賦予其他的值里的“值”指是什么了吧屑柔?

好了,其實(shí)上面的算是ECMAScript 6 入門--阮一峰相關(guān)章節(jié)的筆記蛙讥。

總結(jié)

學(xué)習(xí)東西之后一定要輸出锯蛀,理解了多少就輸出多少,輸出的同時(shí)不僅鞏固已經(jīng)理解的次慢,還會(huì)發(fā)現(xiàn)自以為理解實(shí)際沒有理解的部分以及促使自己去理解更多沒有理解旁涤。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市迫像,隨后出現(xiàn)的幾起案子劈愚,更是在濱河造成了極大的恐慌,老刑警劉巖闻妓,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菌羽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡由缆,警方通過查閱死者的電腦和手機(jī)注祖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來均唉,“玉大人是晨,你說我怎么就攤上這事√蚣” “怎么了罩缴?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長层扶。 經(jīng)常有香客問我箫章,道長,這世上最難降的妖魔是什么镜会? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任檬寂,我火速辦了婚禮,結(jié)果婚禮上戳表,老公的妹妹穿的比我還像新娘桶至。我一直安慰自己拿诸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布塞茅。 她就那樣靜靜地躺著,像睡著了一般季率。 火紅的嫁衣襯著肌膚如雪野瘦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天飒泻,我揣著相機(jī)與錄音鞭光,去河邊找鬼。 笑死泞遗,一個(gè)胖子當(dāng)著我的面吹牛惰许,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播史辙,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼汹买,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了聊倔?” 一聲冷哼從身側(cè)響起晦毙,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎耙蔑,沒想到半個(gè)月后见妒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡甸陌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年须揣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钱豁。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡耻卡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出寥院,到底是詐尸還是另有隱情劲赠,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布秸谢,位于F島的核電站凛澎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏估蹄。R本人自食惡果不足惜塑煎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望臭蚁。 院中可真熱鬧最铁,春花似錦讯赏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至雀哨,卻和暖如春磕谅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背雾棺。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國打工膊夹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捌浩。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓放刨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尸饺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子进统,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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