名字的聲明就是讓我的解釋器知道有這個名字 名字沒有任何數據與之對應 函數聲明包含兩部分 首先告訴解釋器函數的名字 告訴解釋器 這個名字對應的函數體是什麼 函數聲明與函數表達式有區別,函數聲明是單獨寫在一個結構中,不存在任何語句,邏輯判斷等結構中 ``` 函數聲明: function(){} func ...
- 預解析的過程
- 代碼的執行過程 程式在執行過程,會先將代碼讀取到記憶體中檢查,會將所有的聲明在此時進行標記。所謂的標記就是讓js解釋器直到有這個名字,後面在使用名字的時候,不會出現未定義的錯誤,這個標記就是提升 聲明:
- 名字的聲明,標識符的聲明(變數名的提升)
- 名字的聲明就是讓我的解釋器知道有這個名字
- 名字沒有任何數據與之對應
- 函數的聲明
- 函數聲明包含兩部分
- 首先告訴解釋器函數的名字
- 告訴解釋器 這個名字對應的函數體是什麼
- 函數聲明與函數表達式有區別,函數聲明是單獨寫在一個結構中,不存在任何語句,邏輯判斷等結構中 ``` 函數聲明: function(){} function f(){}
- 函數聲明包含兩部分
```
函數表達式:
var f=function(){};
this.sayHello=function(){};
if(true){
function f(){}
}
代碼分析:
案例1:
var num=1;
function num(){
alert(num);
}
num();
- 預解析過程
- 提升聲明 變數num
- 再提升函數 num在記憶體中已經存在,因此直接綁定對應的函數體
- 記憶體中有一個函數num
- 執行代碼
- 給num賦值為1,覆蓋函數
- 調用num 由於num中存儲的是數字1 因此報錯
案例2:
var num=123;
function foo1(){
console.log(num);
var num=456;
console.log(num);
}
foo1();
代碼分析:
- 預解析過程
- 提升變數名num和函數foo1
- 執行代碼
- 給num賦值為123
- 調用函數
- 進入函數的瞬間預解析,提升變數名num
- 在函數內部是一個獨立的空間,允許使用外部的變數即num覆蓋外面的num
- 執行第一句 輸出為Undefined
- 執行第二句 給num賦值為456
- 執行第三句 輸出為456
案例3:
if(true){
function f1(){
console.log('true');
}
}else{
function f1(){
console.log('false');
}
}
f1();
代碼分析:
- 預解析過程
- 函數在判斷語句中為表達式所以不提升
- 執行代碼
- 執行if語句,條件成立,輸出true
- 但是一些老版本在執行過程中,會把If語句中的函數表達式當成函數聲明來解析, 並提升函數輸出為false*