0%

JS核心篇-Hoisting概念

本篇是用來記錄一下有關Hoisting不太熟悉的部分。

函式傳入參數以及一般變數宣告同時出現時的提升優先順序

1
2
3
4
5
function test (a) {
console.log(a)
var a = 12
}
test(10)

本題的答案會是10。
那我們就進行以下的拆解,

1
2
3
4
5
6
7
function test (a) {
var a = 10; // 它就是你呼叫時,傳入的參數
var a;
console.log(a);
a = 12;
}
test(10);
  1. 你應該知道,用var來宣告的時候,只有宣告的部分會被提升,而賦值的部分會停留在原地。
  2. 那這邊的a應該會被提升部分的undefined不分給覆蓋掉阿?
    請你再看看第一點,你就會明白它可以改寫成下面這樣:
    1
    2
    3
    4
    5
    var a;
    var a;
    a = 10;
    console.log(a); // 10
    a = 12
    由此就可以看得出來為什麼是10了吧

函式提升跟變數提升的 和 他們之間的優先權

1
2
3
4
console.log(a);

var a = 10;
function a () {}

上面的答案會是Function: a,原因就是函式本身也會提升,而且它的優先權還比變數高,這就是為什麼結果是函式a的原因囉。

let的Hoisting概念

原本我在學let的時候,本來想說終於有個沒有Hoisting的特性的東西了~~~
但是,沒想到看到以下這個範例,才發現他還是有,只不過let跟var的提升有一點點不一樣。

1
2
3
4
5
6
var b = 10
function test () {
console.log(b)
let b = 20
}
test ()

上面這個範例,出現的結果會是b is not defined的錯誤,所以,代表let也是有Hoisting的特性。