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() {
}
輸出1,不會輸出2。函式宣告和變數宣告都會被提升,但是需要注意的是函式會先被提升,然後才是變數。
var func;
儘管出現在function func()
之前,但它是重複的宣告,會被忽略,因為函式宣告會被提升到普通變數之前。
等同於這樣:
function func() {
console.log(1);
}
func(); // 1
func = function() {
console.log(2);
}
牢記這三點:
只有宣告本身會被提升,而賦值操作不會被提升。
變數會提升到其所在函式的最上面,而不是整個程式的最上面。
函式宣告會被提升,但函式表示式不會被提升