塊級做用域

第一章 塊級做用域綁定安全

var聲明及變量提高(Hoisting)機制異步

經過關鍵字var聲明的變量,都會被當成在當前做用域頂部聲明的變量。函數

塊級聲明指針

塊級做用域存在於:對象

  • 函數內部
  • 塊中(用大括號{}分隔)

用let來聲明變量,就能夠把變量的做用域限制在當前代碼塊中。let聲明不會被提高,因此一般將let聲明語句放在封閉代碼塊的頂部。ip

禁止重聲明作用域

同一做用域中不能用let重複定義已經存在的標識符,可是能夠在內嵌做用域中let聲明上一層做用域的同名變量。變量

const聲明循環

const聲明的是常量,其值一旦被設定後不可更改(實際上是不可修改指針的指向。若是指向對象,則對象的值是能夠修改的),所以const聲明的同時必須進行初始化。最佳實踐

臨時死區(Temporal Dead Zone)

let和const聲明的變量不會提高到做用域頂部,若是在聲明以前訪問這些變量,會觸發ReferenceError(即便是相對安全的typeof操做符)。

JavaScript引擎在掃描代碼發現變量聲明時,要麼將它們提高至做用域頂部(var),要麼將聲明放到TDZ中(let和const)。對於TDZ中的變量,只有執行過變量聲明語句後,變量纔會從TDZ中移出,能夠正常訪問。

循環塊中的塊做用域綁定

對於循環for(let i=0; i < num; i++)中聲明的變量i,只會在循環中才能訪問到,同時每一次循環都是產生一個惟一的變量副本,並不會複用(避免了異步回調時候的取值問題)。

它的做用相似於使用IIFE對其進行再一層的包裝,從而得到一個局部做用域內的變量副本,不與外部共享,保證了取值的正確。

const也能夠用於循環,只是在循環中不能修改它的指向。

全局塊做用域綁定

var用於全局做用域時,會建立一個全新的全局變量做爲全局對象(window或global)的屬性,也就是說var可能會覆蓋已經存在的全局屬性。

let和const用於全局做用域,會建立一個新的綁定,但該綁定不會添加爲全局對象的屬性。它會遮蔽全局的同名屬性,可是依然可使用window.attributeName的形式去獲取到本來的屬性。

塊級綁定最佳實踐的進化

默認使用const,只在確實須要改變變量的值時使用let。

相關文章
相關標籤/搜索