變量名提高

  1. 預解析的過程
  2. 代碼的執行過程 程序在執行過程,會先將代碼讀取到內存中檢查,會將全部的聲明在此時進行標記。所謂的標記就是讓js解釋器直到有這個名字,後面在使用名字的時候,不會出現未定義的錯誤,這個標記就是提高 聲明:
  3. 名字的聲明,標識符的聲明(變量名的提高)
    • 名字的聲明就是讓個人解釋器知道有這個名字
    • 名字沒有任何數據與之對應
  4. 函數的聲明
    • 函數聲明包含兩部分
      • 首先告訴解釋器函數的名字
      • 告訴解釋器 這個名字對應的函數體是什麼
    • 函數聲明與函數表達式有區別,函數聲明是單獨寫在一個結構中,不存在任何語句,邏輯判斷等結構中 ``` 函數聲明: function(){} function f(){}
``` 函數表達式: var f=function(){}; this.sayHello=function(){}; if(true){ function f(){} }``` 函數表達式: var f=function(){}; this.sayHello=function(){}; if(true){ function f(){} }

代碼分析:

案例1:

 var num=1; function num(){ alert(num); } num();var num=1; function num(){ alert(num); } num();
  1. 預解析過程
    • 提高聲明 變量num
    • 再提高函數 num在內存中已經存在,所以直接綁定對應的函數體
    • 內存中有一個函數num
  2. 執行代碼
    • 給num賦值爲1,覆蓋函數
  3. 調用num 因爲num中存儲的是數字1 所以報錯

案例2:

 var num=123; function foo1(){ console.log(num); var num=456; console.log(num); } foo1();var num=123; function foo1(){ console.log(num); var num=456; console.log(num); } foo1();

代碼分析:javascript

  1. 預解析過程
    • 提高變量名num和函數foo1
  2. 執行代碼
    • 給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){ function f1(){ console.log('true'); } }else{ function f1(){ console.log('false'); } } f1();

代碼分析:java

  1. 預解析過程
    • 函數在判斷語句中爲表達式因此不提高
  2. 執行代碼
    • 執行if語句,條件成立,輸出true
    • 可是一些老版本在執行過程當中,會把If語句中的函數表達式當成函數聲明來解析, 並提高函數輸出爲false*
相關文章
相關標籤/搜索