es6 剛流行那會,我只知道 var 即將退出歷史舞臺,取而代之的是 let 和 const,卻不知道 var 有什么缺陷,為什么會被取代。今天在 Youtube 上看到一段視頻,解答了我的疑惑。
本文原標題為 《var 為什么會被 let 取代?》,很多哥們糾結(jié)標題取的不嚴謹或摳字眼,從而忽略了本文真正想要交流的內(nèi)容。這讓我很苦惱,起原先那個標題是因為我所在公司,我的一些技術(shù)好友,以及我在 github 上看到的一些源碼,99% 看不到使用 var 了,對于 IOS 兼容、遺留老代碼里仍使用 var 不在交流范圍內(nèi)。
先看用到 var 的一段代碼。
function doSomething () {
for (var i = 0; i < 5; i++) {
console.log(i)
}
console.log('Finally ' + i)
}
doSomething()
打印結(jié)果:
0
1
2
3
4
Finally 5
i 在 for 語句里定義的,為什么在 for 語句外面仍然打印出來值了呢??
再看用到 let 的一段代碼。
function doSomething () {
for (let i = 0; i < 5; i++) {
console.log(i)
}
console.log('Finally ' + i)
}
doSomething()
打印結(jié)果如下:
0
1
2
3
4
/Users/dkvirus/Documents/study/study-typescript/ex1/var.js:5
console.log('Finally ' + i)
^
ReferenceError: i is not defined
let 定義的變量 i 符合我們的常識,i 的作用域只在 for 語句里,在 for 外部用 i 變量報錯未定義。
結(jié)論:
- let 和 const 定義變量的作用域都是 離變量最近的那個塊 內(nèi);
- var 定義變量的作用域是 離變量最近的那個方法 內(nèi)。上面,用 var 定義的 i 變量的作用域為離 i 最近的方法內(nèi),即 i 的作用域在 doSomething 內(nèi),所以在 for 語句外也能打印出 i 的值。