原來(lái),我真的不懂let

作為一個(gè)JS初學(xué)者,我一直是對(duì)ES6各種奇妙的語(yǔ)法帶有一絲敬畏的.從var-let,promise,解構(gòu),到各種神奇的const騷操作,一直讓我感覺(jué)ES6用的好的人似乎代碼中包含著魔力.

今天在看知乎的時(shí)候,我發(fā)現(xiàn)了方方提的這樣一個(gè)問(wèn)題.
https://www.zhihu.com/question/62966713

問(wèn)題
問(wèn)題

x
lex x=x
x
let x

第一個(gè)第二個(gè)的報(bào)錯(cuò)自然好理解,不用多廢話.但是第三個(gè)和第四個(gè)就比較詭異了:如果我調(diào)用x,那么會(huì)提示x未被定義.但是當(dāng)我想定義x的時(shí)候,x又是已經(jīng)被聲明的?

我發(fā)現(xiàn)以我的知識(shí)無(wú)法理解這個(gè)問(wèn)題.

于是看了一下底下的回答:


title
title

賀老的回答已經(jīng)指出了問(wèn)題的關(guān)鍵,但是對(duì)于我來(lái)說(shuō),還是理解的比較困難.
然后看了孫北吉 的回答,感覺(jué)自己又懂了一些.最后看了方方的博客,感覺(jué)自己似乎還是不太懂.于是嘗試自己解釋并總結(jié)一下.

問(wèn)題的本質(zhì)就是JS 變量的「創(chuàng)建create、初始化initialize 和賦值assign」.

在第一個(gè)報(bào)錯(cuò)直接輸入x中,JS做了這樣的操作:

在當(dāng)前環(huán)境中進(jìn)行查找x.
因?yàn)槭侨汁h(huán)境   ,直接拋出一個(gè) ReferenceError,提示x不存在.

在第二個(gè)報(bào)錯(cuò)lex x=x中:

lex x=x是一個(gè)RHS查詢,它會(huì)直接進(jìn)行值的查找并通知引擎做這些事:
 
 1. 創(chuàng)建變量.
 2. 開(kāi)始執(zhí)行代碼(到現(xiàn)在為止,還未初始化)
 3. 將x進(jìn)行初始化為undefined.(這個(gè)操作并不是賦值,僅僅是初始化)
 4. 執(zhí)行RHS操作將x賦值給x.(這才是賦值操作)
因?yàn)槲覀兊某跏蓟Z(yǔ)句與賦值語(yǔ)句是同一句,所以我們的let x=x同時(shí)執(zhí)行了3\4步的操作.但是這里就出現(xiàn)了一個(gè)問(wèn)題,這一句話是錯(cuò)的.在報(bào)錯(cuò)的同時(shí),第三步已經(jīng)執(zhí)行完成了,而第四步就沒(méi)有辦法進(jìn)行,在報(bào)錯(cuò)的同時(shí)也取消掉了第三步進(jìn)行的對(duì)x的初始化.也就是說(shuō)這個(gè)值已經(jīng)進(jìn)行了變量創(chuàng)建,但是并未初始化.所以:

在第三個(gè)報(bào)錯(cuò)x中:

這個(gè)變量x在當(dāng)前的環(huán)境中已經(jīng)存在(已經(jīng)被創(chuàng)建過(guò)),但是事實(shí)上這個(gè)變量并未進(jìn)行初始化,也就無(wú)法進(jìn)行各種操作以及訪問(wèn)了.此時(shí)就會(huì)拋出一個(gè)Reference Error.

在第四個(gè)報(bào)錯(cuò)let x中:

在此處我們嘗試著進(jìn)行了let x,實(shí)際上執(zhí)行的就是第二個(gè)報(bào)錯(cuò)的第一步-創(chuàng)建變量.但是變量已經(jīng)被創(chuàng)建,所以會(huì)提示變量已存在.就這樣,我們得到了一個(gè)已經(jīng)被創(chuàng)建但是并未被聲明且無(wú)法被訪問(wèn)的變量.

這就是我的理解,如果有錯(cuò)誤,還請(qǐng)看到這里的你指正.謝謝.

So.Because JavaScript.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • let 和 const 命令 let 命令 塊級(jí)作用域 const 命令 頂層對(duì)象的屬性 gl...
    安小明閱讀 1,036評(píng)論 0 0
  • 文章來(lái)自https://zhuanlan.zhihu.com/p/28140450 當(dāng)然不是說(shuō)用完整的兩個(gè)月時(shí)間來(lái)...
    Evan_zhan閱讀 31,241評(píng)論 18 72
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,810評(píng)論 25 709
  • let 基本用法 let命令,用來(lái)聲明變量。用法類似于var,但聲明的變量,只在let命令所在的代碼塊內(nèi)有效。 f...
    oWSQo閱讀 484評(píng)論 0 0
  • 傍晚是望不見(jiàn)云的天 灰藍(lán) 夾雜著幾縷紅暈 大地是個(gè)醉了酒的新郎 把依偎在肩頭的夕陽(yáng) 小心地?cái)埲霊阎?我假意去撫摸留...
    復(fù)姜閱讀 247評(píng)論 6 7

友情鏈接更多精彩內(nèi)容