js預編譯 --預編譯詳解四部曲
預編譯
首先看一個例子
var a = 10
console.log(a); //輸出為10
console.log(a) //輸出為undefined
var a = 10
出現這種情況的原因是:js解釋型語言 ,也就是解釋一行執行一行,第一種情況是正常輸出,第二種之所以會輸出undefined 而不是報錯就是歸功於預編譯
js程式碼執行分為三步:
1,語法分析
2,預編譯
3,解釋執行
語法分析就是通篇檢查你的程式碼有沒有低階錯誤
預編譯發生在程式碼執行的前一刻
解釋執行就是執行你的程式碼
預編譯的前奏
1,imply global 暗示全域性變數 : 也就是任何沒有經過宣告的變數 此變數歸全域性(window)所有
b=123 //相當於 window.b = 123 暗示全域性變數
2,一切宣告的全域性變數 歸window所有
var a =123 //相當於 window.a = 123
預編譯的粗淺理解(這種理解可以用來解決簡單的預編譯問題):
函式宣告整體提升 和 變數,宣告提升
當問題變得複雜,只有更透徹的理解才能理清頭緒
預編譯精裝:
預編譯四部曲:
1,建立GO/AO物件 GO:global object AO:avtive object
2,找形參和變數宣告,將變數和形參名作為AO的屬性名 值為undefined
3,將實參和形參相統一(也就是吧AO物件中的形參屬性的值變成實參的值)
4,在函式體找函式宣告 賦值給函式體
全域性預編譯 生成GO === window
在全域性預編譯完成後進行全域性的程式碼解釋執行 只有在遇到函式呼叫的時候才會觸發函式區域性的預編譯
區域性預編譯生成AO
function f(a){
console.log(a) //function(){}
var a = 123
console.log(a) //123
function a(){}
var b = function(){} //function(){}
function d(){}
}
f(1)
在這個函式中進行預編譯:
1,建立AO物件 AO={ }
2;找形參和變數宣告 將變數和形參名作為AO的屬性名 值為undefined
AO={
a:undefined,
b:undefined
}
3,將實參和形參相統一
AO={
a:1,
b:undefined
}
4,在函式體找函式宣告 賦值給函式體
AO = {
a:function(){}
b:undifined
d:function(){}
}
當預編譯完成後開始執行其他程式碼
相關文章
- JS----預編譯及變數提升詳解JS編譯變數
- #ifndef預編譯編譯
- JS 預編譯程式碼例項分析JS編譯
- CSS預編譯器CSS編譯
- GCC編譯過程(預處理->編譯->彙編->連結)GC編譯
- stylus(css預編譯器)CSS編譯
- 對預編譯的理解編譯
- sqlserver2005預編譯SQLServer編譯
- JavaScript的預編譯過程分析JavaScript編譯
- dll預編譯提高webpack打包速度編譯Web
- css預編譯--sass基礎篇CSS編譯
- 編譯linux kernel預裝工具list編譯Linux
- EF Core預編譯模型Compiled Model編譯模型Compile
- 預編譯過程(AO+GO)編譯Go
- JavaScript預編譯原理, 引擎,作用域JavaScript編譯原理
- Linux下nginx編譯安裝教程和編譯引數詳解LinuxNginx編譯
- 詳解Linux 程式編譯過程Linux編譯
- 你真的理解javascript中的預編譯麼?JavaScript編譯
- doxygen 宏定義/宏編譯/條件編譯/預處理/預編譯 不處理、忽略條件、分析所有條件、滿足所有條件的方法編譯
- [轉]:xmake編譯配置過程詳解編譯
- nginx原始碼編譯安裝(詳解)Nginx原始碼編譯
- CSS預編譯語言Less的用法總結CSS編譯
- CMakeLists.txt --- 匯入介面庫(預編譯庫)編譯
- MySQL中普通sql與預編譯sql 區別MySql編譯
- Vue 之青銅 I 晉級 [預先編譯]Vue編譯
- 【MySQL安裝】Linux下安裝MySQL(預編譯)MySqlLinux編譯
- Java編譯與反編譯Java編譯
- JS 編譯器都做了啥?JS編譯
- libusb android ndk編譯--編譯mipsAndroid編譯
- hadoop編譯—+2.x編譯Hadoop編譯
- N1064編譯鏈編譯編譯
- 編譯編譯
- 前端與編譯原理——用JS寫一個JS直譯器前端編譯原理JS
- 前端與編譯原理——用 JS 寫一個 JS 直譯器前端編譯原理JS
- Linux環境下, 原始碼編譯安裝詳解 (編譯CMake 3.15 和 gcc 5.3.0 為例)Linux原始碼編譯GC
- Hive SQL的底層編譯過程詳解HiveSQL編譯
- Ubuntu 19.10將使用GCC 9作為預設編譯器UbuntuGC編譯
- 聊聊Vue.js的template編譯Vue.js編譯