javascript的變量聲明

在代碼中,聲明變量是基礎,可是在javascript中,經歷了從var到let,const的變化,到底有什麼本質上的區別呢?javascript

本文的原文在個人博客中:https://github.com/RachelRen/blog/issues/25java

歡迎stargit

var 聲明的提高

  1. var 無論在哪裏聲明的,都會被當成在當前做用域頂部聲明的。
  2. 變量提高是在預編譯的過程當中發生的,賦值爲undefined
  3. 被聲明的變量仍是在原來的地方,真正被賦值

塊級聲明

塊級聲明用於聲明在指定塊的做用域以外沒法訪問的變量。github

  1. 在同一做用域內,相同的標識符只能有一個
  2. 當執行流離開這個塊級,那麼這些變量會被銷燬
  3. 塊級做用域中的變量會屏蔽全局做用域中的相同標識符的變量(即取的是塊級做用域中的值)
  4. const 不能再賦值,可是能夠修改對象的屬性值
  5. 不會變量提高

臨時死區

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。爲了實現代碼的不可變,防止某些錯誤的產生。

相關文章
相關標籤/搜索