js 預解析以及變量的提高

js在執行以前會進行預解析。es6

什麼叫預解析?函數

預:提早spa

解析:編譯code

預解析通俗的說:js在執行代碼以前會讀取js代碼,會將變量聲明提早。對象

  • 變量聲明包含什麼?一、var 聲明 二、函數的顯示聲明。
  • 提早:是會將這些變量聲明提早聲明讀取,避免在執行代碼的過程當中出現未定義的問題。

注意:blog

  1.   只是提高變量,並非提高變量賦值
  2.   對於es6中的let不具體 變量提高。

例子:ip

1 <script>
2     test();
3     function test() {
4         console.log(222)
5     }
6 </script>

 

如上代碼不併不會報錯,由於在以前js代碼以前,在預解析的時候,顯示聲明的函數 test 會聲明提早。也就是當前做用域中的變量對象已經存在了函數test。因此不會報錯。作用域

  • 執行環境:執行環境定義了變量和函數有權訪問其餘數據,每一個執行環境都有與之關聯的變量對象。執行環境中的定義的變量和函數都存儲在這個變量中。
  • 變量對象:變量對象咱們沒法調用,可是在解析器處理數據的會在後臺調用他。函數: 執行環境就是該函數能夠調用的變量和數據。存儲在變量對象中,當代碼在環境中執行,會建立一個變量對象的做用域鏈。
  • 做用域鏈:保證對執行環境中的全部變量和函數有序訪問。
  • 執行流:js代碼執行從上到下依次執行。當執行流進行一個函數中,會將函數的執行環境(也叫作環境)推入一個環境棧中,而在函數執行完以後,會將該環境彈出,將控制權返回以前的執行環境中。js中的執行流就是經過該機制執行。
  • 標識符:代碼中用來標識變量函數、或屬性的字符序列。(https://developer.mozilla.org/zh-CN/docs/Glossary/Identifier)。命名規則和變量同樣,首字母只能字母、下劃線、$開頭不能以數字開頭。
  • 函數標識符解析:從當前函數的局部做用域查找,若是沒有在向上做用域查找,依次回溯查找直到查到最外層全局做用域。若是沒有會報錯。

對於函數的聲明的 提高只是針對顯示聲明的函數,對於函數表達式沒有這個提高。get

1   a();
2     var  a=()=>{
3         console.log(22)
4     }

如上用var 聲明a,提高了變量可是在預解析的時候a的值是undefined 並非函數因此會報a is not a function,變量的聲明提早並非賦值提早!!input

函數表達式遵循的是先聲明在調用的原則。

  var a=()=>{ console.log(22) }; a(); 

相關文章
相關標籤/搜索