在代碼中,聲明變量是基礎,可是在javascript中,經歷了從var到let,const的變化,到底有什麼本質上的區別呢?javascript
本文的原文在個人博客中:https://github.com/RachelRen/blog/issues/25java
歡迎stargit
塊級聲明用於聲明在指定塊的做用域以外沒法訪問的變量。github
let 和 const 是不會變量提高的,因此在聲明變量以前,是用typeof
是會報錯的。瀏覽器
臨時死區(TDZ)用來描述let/const不提高的效果code
Javascript引擎在掃描代碼發現變量聲明時,要麼將他們提高到做用域頂部(var聲明),要麼將聲明放到TDZ(臨時死區)中,訪問TDZ中的變量會觸發運行時錯誤。 只有執行變量聲明語句後,變量纔會從TDZ中移出,而後才能夠正常訪問。let 聲明在循環內部的行爲是標準中專門定義的,它不必定與let的不提高特性相關。對象
在for-in 和 for-of 循環中,let和const會每次迭代時建立新綁定,因此在循環體內,每次都訪問到響應的迭代值。但在for-lenght中,const會報錯。blog
var在全局做用域中,會建立一個新的全局變量做爲全局對象。
let/const會在全局做用域下建立一個新的綁定,可是這個綁定不會添加爲全局對象的屬性(let/const不能覆蓋全局,只能屏蔽它)ip
用var來定義全局變量,能夠用在瀏覽器的跨frame或跨window訪問代碼。作用域
默認使用const,只在肯定須要改變值的時候用let。爲了實現代碼的不可變,防止某些錯誤的產生。