什麼是變量提高?
JavaScript 中,函數及變量的聲明都將被提高到函數的最頂部。 JavaScript 中,變量能夠在使用後聲明,也就是變量能夠先使用再聲明。面試
一)var聲明變量存在變量提高,let和const不存在變量提高bash
console.log(a); // undefined ===> a已聲明還沒賦值,默認獲得undefined值
var a = 100;
console.log(b); // 報錯:b is not defined ===> 找不到b這個變量
let b = 10;
console.log(c); // 報錯:c is not defined ===> 找不到c這個變量
const c = 10;
複製代碼
再來看這段代碼函數
function fn() {
//var a
if (true) {
console.log(a + ' now')
}
else {
var a = 1
console.log(2)
}
}
fn() // a -> undefined
複製代碼
咱們發現不執行的代碼也會影響會執行的代碼,由於var a會提高到if語句的前面網站
undefined能夠翻譯爲不明確,not defined能夠翻譯爲未定義ui
在Java中變量的分爲全局變量(成員變量)或者局部變量,在方法體中定義的變量都是局部變量,不然是全局變量(即在方法體外,在類中定義的變量)spa
在JavaScript中,在方法體外外用var定義的變量其它方法能夠共享,在方法中用var定義的變量只有該方法內生效。翻譯
二)let、const都是塊級局部變量
顧名思義,就是隻在當前代碼塊起做用code
{
let a = 1
}
console.log(a) // undefined
複製代碼
const 的特性和 let 徹底同樣,不一樣的只是
1)聲明時候必須賦值cdn
const a
複製代碼
編譯器報錯 blog
控制檯報錯SyntaxError: Missing initializer in const declaration
複製代碼
2)只能進行一次賦值,即聲明後不能再修改
const a=1
a=2
複製代碼
編譯器報錯
控制檯報錯TypeError: Assignment to constant variable.
複製代碼
3)若是聲明的是複合類型數據,能夠修改其屬性
三)同一做用域下let和const不能聲明同名變量,而var能夠
const a =2
const a=1
複製代碼
SyntaxError: Identifier 'b' has already been declared
複製代碼
簡單的Demo
for (let i = 0; i < 5; i++) {
console.log(i)
}
複製代碼
上面的代碼咱們知道打印結果是 0, 1, 2, 3, 4,可是大家有沒有想過這個變量i的做用域究竟是什麼呢?
有人說在這個for循環裏呀,可是我這裏想說的是這個i做用域是在括號()裏。正常的代碼是這樣的:
1.首先這個變量_i的做用域是在()裏纔有效的,循環體裏是不能訪問到_i的
2.每次循環的時候建立一個i變量,將括號裏的_i賦值到變量i上
3.最後i++後再將變量i的值賦值回_i上
固然這個過程是很複雜的,能夠用下面代碼理解,可是JS的實現機制是很複雜的,這裏想要說明的let i的做用域有時候並非咱們所理解的那樣的。
for (let _i = 0; i < 5; i++) {
let i = _i
console.log(i)
// i++ 先作
_i = i
}
複製代碼