什么是變量提升?什么是函數提升?


在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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM