ECMAScript中var let const常見問題及區(qū)別詳解
引言
在ECMAScript中,有3個關鍵字可以用于聲明變量。分別是:var、let和const。其中,var在所有ECMAScript都是可以使用的,但是let和const需要在ECMAScript6及其以上版本才可以使用。
let和const的行為基本一致,但是其中有一個比較重要的一個區(qū)別,就是const用它聲明變量時必須同時初始化變量,且嘗試修改const聲明的變量會導致運行錯誤。所以常有人直接理解為const用于聲明常量。
一:作用域
var是函數(shù)作用域。
let和const是塊級作用域。
也就是說var聲明的變量出函數(shù)時就會被銷毀,而let和const聲明的變量出塊級內部就會被銷毀。
下面使用for舉例:
for中的變量聲明,也是var和let的區(qū)別之一。
for (var i = 0; i < 5; i++) { setTimeout(() => { console.log(i); }, 0); } //5 5 5 5 5 for (var i = 0; i < 5; i++) { setTimeout(() => { console.log(i); }, 0); } //0 1 2 3 4
造成這種現(xiàn)象的原因就是:var可以滲透到循環(huán)體外部,在退出循環(huán)的時候,迭代變量保存的是導致循環(huán)退出的值。而let的是因為作用域反限于for循環(huán)塊的內部,迭代循環(huán)聲明一個新的變量,每個setTimeout引用的都是不同的變量實例。
二:優(yōu)先級
三個關鍵字之間沒有優(yōu)先級,按照聲明順序。
三:全局聲明區(qū)別
let和var的不同是,let不會成為window對象的屬性。
var name = "Matt". console.log(window.name); //Matt let name = "Matt" console.log(window.name);//undefined
四:變量提升
這也就是let和var的一個重要的區(qū)別,就是let聲明的變量不會在作用域中被提升。
console.log(name); //undefined var name = "Matt"; console.log(name); //ReferenceError: name is not defined let name = "Matt"
在代碼解析時,JavaScript引擎也會注意到后面的let(也就是常談到的“類似提升行為”),只不過在此之前不能操作這個被聲明的變量,不然就會送給你漂亮的紅色ReferenceError。而這個瞬間也被稱之為“暫時性死區(qū)”。也算是在某些方面限制了代碼的規(guī)范度吧。
其他:
1.在ES6中明確規(guī)定,在{}中出現(xiàn)let和const,就會被限制在里面(也就是塊級作用域)。
2.函數(shù)提升優(yōu)先級大于var的變量提升(還是不要重名比較好,你想想要是你們部門有人和你重名重姓會多麻煩)。
以上就是ECMAScript中var let const常見問題及區(qū)別詳解的詳細內容,更多關于ECMAScript中var let const區(qū)別的資料請關注腳本之家其它相關文章!
相關文章
基于JavaScript如何實現(xiàn)私有成員的語法特征及私有成員的實現(xiàn)方式
本文給大家介紹基于JavaScript如何實現(xiàn)私有成員的語法特征及私有成員的實現(xiàn)方式,涉及到javascript語法特征相關知識,對本文感興趣的朋友快來一起學習吧2015-10-10JavaScript循環(huán)遍歷的24個方法,你都知道嗎
這篇文章主要給大家介紹了關于JavaScript循環(huán)遍歷的24個方法,文中對每種方法都給出了詳細的實例代碼,方便大家理解學習,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2021-09-09JS實現(xiàn)動態(tài)生成表格并提交表格數(shù)據(jù)向后端
這篇文章主要為大家詳細介紹了JS實現(xiàn)動態(tài)生成表格并提交表格數(shù)據(jù)向后端的相關資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-01-01