第一章 塊級做用域綁定安全
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。