1. 程式人生 > 實用技巧 >57.什麼是變數提升

57.什麼是變數提升

在js中只有兩種作用域,全域性作用域和函式作用域,在ES6之前,js是沒有塊級作用域。

JavaScript 程式碼的執行分為兩個階段。第一個階段在當前詞法環境中註冊所有的變數和函式宣告,簡單說就是,解析,解析完成之後,第二個階段的 JavaScript 執行就開始了!

JS中建立函式有兩種方式:函式宣告式和函式字面量式。只有函式宣告才存在函式提升。

JavaScript 僅提升宣告,而不提升初始化。如果你先使用的變數,再宣告並初始化它,變數的值將是 undefined。

1:所有的宣告都會提升到作用域的最頂上去。

2:同一個變數只會宣告一次,其他的會被忽略掉。

3:函式宣告的優先順序高於變數申明的優先順序,並且函式宣告和函式定義的部分一起被提升。

變數提升的例子:

num = 6;
var num = 7;
var num;
console.log(num); // 不報錯,輸出7,也證明了變數只會宣告一次,其他的會被忽略。

函式提升的例子:

catName("Chloe");// 即使在宣告之前呼叫依然可以執行,不會報錯

function catName(name) {
console.log("我的貓名叫 " + name);
}

在定義的函式名字和變數名相同的情況下,函式提升優先順序高於變數的例子:

func(); // 1
var func;
function func() {
console.log(1);
}
func = function() {

console.log(2);
}

輸出1,不會輸出2。函式宣告和變數宣告都會被提升,但是需要注意的是函式會先被提升,然後才是變數。

var func;儘管出現在function func()之前,但它是重複的宣告,會被忽略,因為函式宣告會被提升到普通變數之前。

等同於這樣:

function func() {
console.log(1);
}
func(); // 1
func = function() {
console.log(2);
}

牢記這三點:

只有宣告本身會被提升,而賦值操作不會被提升。

變數會提升到其所在函式的最上面,而不是整個程式的最上面。

函式宣告會被提升,但函式表示式不會被提升