爲何要出現let和const呢?確定是var很差(var:呵呵!)。
var存在的問題:
1.變量聲明提高
2.可重複定義
3.全局變量掛載到window上。
這些是js在設計時候的缺點,容易在開發中致使不少錯誤。全局變量掛載到window上不一樣意查找,並且容易覆蓋。
閉包也是很是頭疼的問題,下面例子原本是想打印1,3,5的,然兒會輸出10,10,10。git
var arr = []
for (var i = 0;i <10;i++) {
arr[i] = function() {
console.log(i)
}
}
arr[1]() // 10
arr[3]() // 10
arr[5]() // 10
複製代碼
若是使用let就會解決閉包問題,輸出1,3,5github
let arr = []
for (let i = 0; i < 10; i++) {
arr[i] = function () {
console.log(i)
}
}
arr[1]() // 1
arr[3]() // 3
arr[5]() // 5
複製代碼
由於var存在這些缺點,因此就出現let來彌補這些缺點了。web
1.不會出現聲明提高 2.不可重複定義 3.增強做用域的控制 4.配合{}能夠實現塊級做用域:微信
if () {
// 塊級做用域
}
while () {
// 塊級做用域
}
for () {
// 塊級做用域
}
switch () {
// 塊級做用域
}
複製代碼
聲明不能提高閉包
{
let a =10
{
//在裏面能夠訪問外面let的變量
console.log(a) // 10
}
}
複製代碼
let會產生臨時性死區,臨時性死區,只要在塊級做用域中let變量,就不會訪問外面同名變量。解決辦法爲從新設置個變量名。異步
{
let a = 10
{
//臨時性死區,只要在塊級做用域中let變量,就不會訪問外面同名變量。解決辦法爲從新設置個變量名。
console.log(a) //報錯,a沒有被定義
let a = 20
}
}
複製代碼
下面例子會幫助你們加深對let的理解。(能不能加深我也不知道,呵呵!)函數
由於setTimeout是異步加載當函數執行時i就已經變成10了,因此會輸出10個10spa
for(var i = 0;i<10;i ++) {
setTimeout(() => {
console.log(i) //輸出10個10
}, 0);
}
複製代碼
若是var改爲let就可解決這個問題。設計
for(let i = 0;i<10;i ++) {
setTimeout(() => {
console.log(i) //輸出0,1,2...,9
}, 0);
}
複製代碼
function形參至關於 var,裏面不可用let重複聲明,能夠用var。code
function na(a,b) {
let a = 10 //報錯,形參至關於var a
}
na()
複製代碼
const 是聲明一個常量,聲明以後不可被改變,開發中推薦使用const > let > var(別用var了,哈哈)
const PI = 3.14
const PI = 111 // 報錯,不可改變
複製代碼
const存儲常量的值不會被改變,可是存儲常量值對應的空間的值能夠被改變
const arr = {}
arr.name = 'bb'
console.log(arr) //{name: "bb"}
arr.name = 'cc'
console.log(arr) //{name: "cc"}
複製代碼
const除了不可被改變,其餘的和let用法相同。\
廣告:
做者github:github.com/webxukai
做者gitee:gitee.com/webxukai 做者微信:e790134972 做者QQ:我想你應該知道了! 做者QQ郵箱:同上,呵呵!