在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);
}
牢記這三點:
只有聲明本身會被提升,而賦值操作不會被提升。
變量會提升到其所在函數的最上面,而不是整個程序的最上面。
函數聲明會被提升,但函數表達式不會被提升。
————————————————
版權聲明:本文為CSDN博主「木心Do」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_33505829/article/details/86158287
