JavaScript中var與let的區(qū)別
前言:
var
是JavaScript
剛出現(xiàn)時就存在的變量聲明關(guān)鍵字,而let作為ES6才出現(xiàn)的變量聲明關(guān)鍵字,無疑兩者之間存在著很大的區(qū)別。那么具體有哪些區(qū)別呢?
1.作用域表現(xiàn)形式不同
var是函數(shù)作用域,let是塊級作用域
{ var monkey='熏悟空'; let pig='豬扒蓋'; } console.log(monkey); //輸出undefined console.log(pig); //報錯:pig is not deined
由上面代碼可見,let
聲明的變量只在其所在的代碼塊有效,在代碼塊外部無效無法訪問,而var聲明的變量在該代碼塊所在的函數(shù)作用域內(nèi)都有效。
2.是否變量提升的區(qū)別
var聲明的變量會進(jìn)行變量提升,let聲明的變量不會進(jìn)行變量提升。
console.log(monkey); //undefined var monkey='熏悟空'; console.log(pig); //報錯:pig is not defined let pig='豬扒蓋';
同樣的邏輯,為什么var聲明的變量在它聲明之前調(diào)用會顯示未定義,而let聲明的變量在聲明之前調(diào)用會拋出異常呢,這就是兩者在變量提升上的區(qū)別,var聲明的變量存在變量提升,let聲明的變量不存在變量提升。
那么什么叫變量提升呢,我這里不做概念性的描述,我只說我個人的理解,就是以上代碼實(shí)際上相當(dāng)于如下:
var monkey; console.log(monkey); //undefined monkey='熏悟空'; console.log(pig); //報錯:pig is not defined let pig='豬扒蓋';
看見區(qū)別了嗎,var聲明的變量會將聲明的變量提取到作用域的最上面進(jìn)行定義但不賦值,賦值操作還是在你的代碼處,所以你在調(diào)用var
聲明的變量時就是一個已經(jīng)聲明但是并未定義值的變量,所以調(diào)用結(jié)果就是undefined
,這就是所謂的變量提升。而let定義的變量不存在這種變量提升。
3.暫時性死區(qū)上的區(qū)別
暫時性死區(qū):如果在某一作用域內(nèi)let了一個變量,如果外部作用域中有相同名稱的變量,那么就算在作用域內(nèi)進(jìn)行了更改,也不會影響到外部作用域
具體表現(xiàn)如下:
for(var i=0;i<5;i++){ setTimeout(function(){ console.log(i) },1000) } for(let i=0;i<5;i++){ setTimeout(function(){ console.log(i) },1000) }
請問這兩處代碼的運(yùn)行結(jié)果分別是什么?
第一處代碼運(yùn)行完畢的結(jié)果是1s后順序打印5個5;第二處代碼運(yùn)行完畢的結(jié)果是1s后順序打印0,1,2,3,4。
請問為什么會存在這種區(qū)別?
因?yàn)榈谝惶幋a的變量i由var關(guān)鍵字聲明,不存在關(guān)鍵性死區(qū),即你在1s后setTimeout
中訪問到的變量i是全局上下文中for循環(huán)運(yùn)行完畢之后的i,所以打印的結(jié)果全是5;
而第二處代碼的變量i由let關(guān)鍵字聲明,產(chǎn)生了關(guān)鍵性死區(qū),存在setTimeout
中的i變量是你當(dāng)時存儲時的i的值,這個存儲區(qū)間的i不會因?yàn)橥饷嬗邢嗤膇變量且賦了不同的值而改變,他依舊是之前存儲進(jìn)去的值,這就是暫時性死區(qū)的表現(xiàn),也是為什么第二處代碼運(yùn)行完畢是順序打印0,1,2,3,4的原因。
4.在同一個上下文中var可以重復(fù)聲明,let不行
let monkey='熏悟空'; let monkey='逼馬吻'; //報錯:Identifier 'a' has already been declared var pig='豬扒蓋'; var pig='豬肛裂'; //正常訪問,變量pig的值被替換
到此這篇關(guān)于JavaScript中var與let的區(qū)別的文章就介紹到這了,更多相關(guān)JavaScript中var與let內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
EasyUi combotree 實(shí)現(xiàn)動態(tài)加載樹節(jié)點(diǎn)
這篇文章主要介紹了EasyUi combotree 實(shí)現(xiàn)動態(tài)加載樹節(jié)點(diǎn)的相關(guān)資料,需要的朋友可以參考下2016-04-04優(yōu)化innerHTML操作(提高代碼執(zhí)行效率)
多數(shù)現(xiàn)代瀏覽器都實(shí)現(xiàn)了innerHTML操作,它的方便性讓我們愛不釋手,但如果使用不當(dāng),很容易出現(xiàn)效率問題,本文通過一個例子來說明如何優(yōu)化innerHTML操作。2011-08-08js鼠標(biāo)滑輪滾動事件綁定的簡單實(shí)例(兼容主流瀏覽器)
本篇文章主要介紹了js鼠標(biāo)滑輪滾動事件綁定的簡單實(shí)例(兼容主流瀏覽器)。需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01如何使用TypeScript實(shí)現(xiàn)一個瀏覽器事件的集中管理
這篇文章主要介紹了使用TypeScript實(shí)現(xiàn)一個瀏覽器事件的集中管理,瀏覽器事件模型的主要優(yōu)點(diǎn)是它可以使開發(fā)人員更加靈活地處理用戶交互,并且可以通過事件委托等技術(shù)來提高性能,本文給大家講解的非常詳細(xì),需要的朋友可以參考下2023-06-06js對象屬性名駝峰式轉(zhuǎn)下劃線的實(shí)例代碼
這篇文章主要介紹了js對象屬性名駝峰式轉(zhuǎn)下劃線的實(shí)例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09基于javascript實(shí)現(xiàn)表格的簡單操作
這篇文章主要為大家詳細(xì)介紹了基于javascript實(shí)現(xiàn)表格的簡單操作,具有一定的參考價值,感興趣的朋友可以參考一下2016-05-05webpack5的loader配置小白學(xué)習(xí)篇
這篇文章主要為大家介紹了webpack5的loader配置非常適合webpack入門的小白學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05關(guān)于使用runtimeStyle屬性問題討論文章
關(guān)于使用runtimeStyle屬性問題討論文章...2007-03-03js中document.referrer實(shí)現(xiàn)移動端返回上一頁
本文主要介紹了document.referrer實(shí)現(xiàn)移動端返回上一頁的方法,具有很好的參考價值,下面跟著小編一起來看下吧2017-02-02