作用域:變量作用域(全局變量和局部變量) 、函數作用域(函數內部的變量)
作用域鏈:其實就是一些可訪問對象的集合。比如函數執行時會產生一個活動對象,活動對象中。
在JavaScript中,函數也是對象,實際上,JavaScript裏一切都是對象。函數對象和其它對象一樣,擁有可以通過代碼訪問的屬性和一系列僅供JavaScript引擎訪問的內部屬性。其中一個內部屬性是[[Scope]],該內部屬性包含了函數被創建的作用域中對象的集合,這個集合被稱爲函數的作用域鏈,它決定了哪些數據能被函數訪問。
當一個函數創建後,它實際上保存一個作用域鏈,並且作用域鏈會被創建此函數的作用域中可訪問的數據對象填充。
var:
1、可能存在聲明提前
var聲明、未初始化的變量會提升
未聲明的變量賦值的變量會提升
只有var聲明、初始化的變量不會提升
2、能重複聲明、能重複賦值
3、不存在塊作用域
let:
1、不存在聲明提前,在塊作用域的頂端會有暫時性死區。
2、不能重複聲明、能重新賦值
3、存在塊作用域
const:
同於let,區別在於const不能重複賦值。
var聲明的變量需要注意的是,函數內部函數執行完成即可銷燬,如果在window作用域下,則在關閉頁面時纔會銷燬。
結語:那麼何時使用let、const呢,如果只是引用,請使用let、const。循環中,優先使用let。