談談變量提升?
當執行 JS 代碼時,會生成執行環境,只要代碼不是寫在函數中的,就是在全局執行環境中,函數中的代碼會產生函數執行環境,只此兩種執行環境
- 接下來讓我們看一個老生常談的例子,
var
b() // call b
console.log(a) // undefined
var a = 'Hello world'
function b() {
console.log('call b')
}
變量提升
這是因爲函數和變量提升的原因。通常提升的解釋是說將聲明的代碼移動到了頂部,這其實沒有什麼錯誤,便於大家理解。但是更準確的解釋應該是:在生成執行環境時,會有兩個階段。第一個階段是創建的階段,JS 解釋器會找出需要提升的變量和函數,並且給他們提前在內存中開闢好空間,函數的話會將整個函數存入內存中,變量只聲明並且賦值爲 undefined
,所以在第二個階段,也就是代碼執行階段,我們可以直接提前使用
在提升的過程中,相同的函數會覆蓋上一個函數,並且函數優先於變量提升
b() // call b second
function b() {
console.log('call b fist')
}
function b() {
console.log('call b second')
}
var b = 'Hello world'
複製代碼var
會產生很多錯誤,所以在 ES6
中引入了 let
。let
不能在聲明前使用,但是這並不是常說的 let
不會提升,let
提升了,在第一階段內存也已經爲他開闢好了空間,但是因爲這個聲明的特性導致了並不能在聲明前使用
個人博客地址:大家可以看看