摘要:變量提升是在預(yù)編譯的過(guò)程中發(fā)生的,賦值為被聲明的變量還是在原來(lái)的地方,真正被賦值塊級(jí)聲明塊級(jí)聲明用于聲明在指定塊的作用域之外無(wú)法訪問(wèn)的變量。只有執(zhí)行變量聲明語(yǔ)句后,變量才會(huì)從中移出,然后才可以正常訪問(wèn)。
在代碼中,聲明變量是基礎(chǔ),但是在javascript中,經(jīng)歷了從var到let,const的變化,到底有什么本質(zhì)上的區(qū)別呢?
本文的原文在我的博客中:https://github.com/RachelRen/blog/issues/25
歡迎star
var 聲明的提升var 不管在哪里聲明的,都會(huì)被當(dāng)成在當(dāng)前作用域頂部聲明的。
變量提升是在預(yù)編譯的過(guò)程中發(fā)生的,賦值為undefined
被聲明的變量還是在原來(lái)的地方,真正被賦值
塊級(jí)聲明塊級(jí)聲明用于聲明在指定塊的作用域之外無(wú)法訪問(wèn)的變量。
在同一作用域內(nèi),相同的標(biāo)識(shí)符只能有一個(gè)
當(dāng)執(zhí)行流離開(kāi)這個(gè)塊級(jí),那么這些變量會(huì)被銷毀
塊級(jí)作用域中的變量會(huì)屏蔽全局作用域中的相同標(biāo)識(shí)符的變量(即取的是塊級(jí)作用域中的值)
const 不能再賦值,但是可以修改對(duì)象的屬性值
不會(huì)變量提升
臨時(shí)死區(qū)let 和 const 是不會(huì)變量提升的,所以在聲明變量之前,是用typeof是會(huì)報(bào)錯(cuò)的。
臨時(shí)死區(qū)(TDZ)用來(lái)描述let/const不提升的效果
在循壞中的應(yīng)用Javascript引擎在掃描代碼發(fā)現(xiàn)變量聲明時(shí),要么將他們提升到作用域頂部(var聲明),要么將聲明放到TDZ(臨時(shí)死區(qū))中,訪問(wèn)TDZ中的變量會(huì)觸發(fā)運(yùn)行時(shí)錯(cuò)誤。只有執(zhí)行變量聲明語(yǔ)句后,變量才會(huì)從TDZ中移出,然后才可以正常訪問(wèn)。let 聲明在循環(huán)內(nèi)部的行為是標(biāo)準(zhǔn)中專門定義的,它不一定與let的不提升特性相關(guān)。
在for-in 和 for-of 循環(huán)中,let和const會(huì)每次迭代時(shí)創(chuàng)建新綁定,所以在循環(huán)體內(nèi),每次都訪問(wèn)到響應(yīng)的迭代值。但在for-lenght中,const會(huì)報(bào)錯(cuò)。
在全局作用域中的區(qū)別var在全局作用域中,會(huì)創(chuàng)建一個(gè)新的全局變量作為全局對(duì)象。
let/const會(huì)在全局作用域下創(chuàng)建一個(gè)新的綁定,但是這個(gè)綁定不會(huì)添加為全局對(duì)象的屬性(let/const不能覆蓋全局,只能屏蔽它)
用var來(lái)定義全局變量,可以用在瀏覽器的跨frame或跨window訪問(wèn)代碼。
最佳實(shí)踐默認(rèn)使用const,只在確定需要改變值的時(shí)候用let。為了實(shí)現(xiàn)代碼的不可變,防止某些錯(cuò)誤的產(chǎn)生。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/109461.html
摘要:在中,沒(méi)有塊級(jí)作用域一說(shuō)在或者等語(yǔ)言中,等語(yǔ)句塊內(nèi)可以包含自己的局部變量,這些變量的作用域是這些語(yǔ)句的語(yǔ)句塊,而在中,不存在塊級(jí)作用域的說(shuō)法。作用域鏈如果要深入理解中變量的作用域,那就必須拿出作用域鏈這個(gè)終極武器。 Javascript 這門語(yǔ)言與其他的大部分語(yǔ)言相比,有很多特殊性,這是很多人喜歡它或者討厭它的原因。其中變量的作用域問(wèn)題,對(duì)很多初學(xué)者來(lái)說(shuō)就是一個(gè)又一個(gè)「坑」。 變量的...
摘要:輸出的結(jié)果為輸出的結(jié)果為提升后輸出的結(jié)果為重新定義了變量輸出的結(jié)果為如果定義了相同的函數(shù)變量聲明,后定義的聲明會(huì)覆蓋掉先前的聲明,看如下代碼輸出練習(xí)的值是多少的值是多少第二題的解析請(qǐng)看這里參考資料文章文章中文版鏈接文章推薦文章變量提升 JavaScript 變量聲明提升 原文鏈接 一個(gè)小例子 先來(lái)看個(gè)例子: console.log(a); // undefined var a =...
摘要:作用域是代碼的不同部分在運(yùn)行期間的可見(jiàn)性。大多數(shù)開(kāi)發(fā)者想當(dāng)然地理解作用域,但毫無(wú)疑問(wèn),有它自己的說(shuō)明。變量可能是全局作用域的,或者是方法作用域的。總而言之,不要重復(fù)聲明變量,使用良好命名,盡力避免在聲明前調(diào)用和執(zhí)行任何東西。 原文鏈接:https://hackernoon.com/unders... 什么是作用域? 就像JavaScript中的其他東西一樣,作用域并無(wú)特別之處。盡管大多...
摘要:一概念是一個(gè)單線程解釋型的編程語(yǔ)言。預(yù)編譯大致可分為步創(chuàng)建對(duì)象找形參和變量聲明,將形參和變量名作為屬性名,值為將實(shí)參值和形參統(tǒng)一在函數(shù)體里面找函數(shù)聲明,值賦予函數(shù)體。 一、JavaScript概念 JavaScript ( JS ) 是一個(gè)單線程、解釋型的編程語(yǔ)言。 二、JavaScript語(yǔ)言特點(diǎn) 2.1 單線程 JavaScript語(yǔ)言的一大特點(diǎn)就是單線程,也就是說(shuō),同一個(gè)時(shí)間只能...
摘要:預(yù)編譯發(fā)生在函數(shù)執(zhí)行前也就是說(shuō)函數(shù)執(zhí)行時(shí),預(yù)編譯已經(jīng)結(jié)束。五總結(jié)理解預(yù)編譯需要明白變量函數(shù)聲明和變量賦值。預(yù)編譯階段,只進(jìn)行變量函數(shù)聲明,不會(huì)進(jìn)行變量的初始化即變量賦值,所有變量的值都是變量賦值是在解釋執(zhí)行階段才進(jìn)行的。 一、JS的概念 JavaScript ( JS ) 是一種具有函數(shù)優(yōu)先的輕量級(jí)解釋型或即時(shí)編譯型的編程語(yǔ)言。 二、JS語(yǔ)言特點(diǎn) 2.1 單線程 (1)JavaScri...
摘要:作用域的類別可以影響到變量的取值,分為詞法作用域靜態(tài)作用域和動(dòng)態(tài)作用域。而,采用的就是詞法作用域,或者叫靜態(tài)作用域。 關(guān)于javascript中的作用域和作用域鏈 我GitHub上的菜鳥(niǎo)倉(cāng)庫(kù)地址: 點(diǎn)擊跳轉(zhuǎn)查看其他相關(guān)文章 文章在我的博客上的地址: 點(diǎn)擊跳轉(zhuǎn) ? ? ? ? 前面的文章說(shuō)到, 執(zhí)行上下文的創(chuàng)建階段,主要有三個(gè)內(nèi)容: ? ? ? ? 1、創(chuàng)建變量對(duì)象;2、初始化作用域...
閱讀 3416·2023-04-25 22:04
閱讀 2208·2021-11-22 15:29
閱讀 2180·2021-10-11 10:57
閱讀 1422·2021-09-24 09:48
閱讀 3162·2021-09-09 09:34
閱讀 2561·2021-09-02 15:21
閱讀 2406·2019-08-30 15:53
閱讀 1147·2019-08-30 14:07