小編給大家分享一下JavaScript中預編譯的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)建站成都網(wǎng)站建設按需網(wǎng)站設計,是成都網(wǎng)站推廣公司,為成都塔吊租賃提供網(wǎng)站建設服務,有成熟的網(wǎng)站定制合作流程,提供網(wǎng)站定制設計服務:原型圖制作、網(wǎng)站創(chuàng)意設計、前端HTML5制作、后臺程序開發(fā)等。成都網(wǎng)站維護熱線:028-86922220
JavaScript 預編譯原理
今天用了大量時間復習了作用域、預編譯等等知識
看了很多博文,翻開了以前看過的書(好像好多書都不會講預編譯)
發(fā)現(xiàn)當初覺得自己學的很明白,其實還是存在一些思維誤區(qū) (很多博文具有誤導性)
今晚就整理了一下凌亂的思路
先整理一下預編譯的知識吧,日后有時間再把作用域詳細講解一下
大家要明白,這個預編譯和傳統(tǒng)的編譯是不一樣的(可以理解js預編譯為特殊的編譯過程)
JavaScript是解釋型語言,
既然是解釋型語言,就是編譯一行,執(zhí)行一行
傳統(tǒng)的編譯會經(jīng)歷很多步驟,分詞、解析、代碼生成什么的
日后有時間再給大家科普
下面就給大家分享一下我所理解的JS預編譯
JavaScript運行三部曲
腳本執(zhí)行js引擎都做了什么呢?
語法分析
預編譯
解釋執(zhí)行
在執(zhí)行代碼前,還有兩個步驟
語法分析很簡單,就是引擎檢查你的代碼有沒有什么低級的語法錯誤
解釋執(zhí)行顧名思義便是執(zhí)行代碼了
預編譯簡單理解就是在內(nèi)存中開辟一些空間,存放一些變量與函數(shù)
理解了預編譯對大家理解作用域同樣有幫助
JS預編譯什么時候發(fā)生
我當初思維誤區(qū)也發(fā)生在這里
預編譯到底什么時候發(fā)生
希望大家不要讓上面的運行過程讓你產(chǎn)生誤會,
誤以為預編譯僅僅發(fā)生在script內(nèi)代碼塊執(zhí)行前
這倒并沒有錯
預編譯確確實實在script代碼內(nèi)執(zhí)行前發(fā)生了
但是它大部分會發(fā)生在函數(shù)執(zhí)行前
JS預編譯實例
舉例前,先來思考一下這幾個概念:
變量聲明 var…
函數(shù)聲明 function…
<script> var a = 1;// 變量聲明 function b(y){//函數(shù)聲明 var x = 1; console.log('so easy'); }; var c = function(){//是變量聲明而不是函數(shù)聲明?。? //... } b(100); </script> <script> var d = 0; </script>
讓我們看看引擎對這段代碼做了什么吧
1.頁面產(chǎn)生便創(chuàng)建了GO全局對象(Global Object)(也就是大家熟悉的window對象)
2.第一個腳本文件加載
3.腳本加載完畢后,分析語法是否合法
4.開始預編譯
查找變量聲明,作為GO屬性,值賦予undefined
查找函數(shù)聲明,作為GO屬性,值賦予函數(shù)體
//偽代碼 GO/window = { //頁面加載創(chuàng)建GO同時,創(chuàng)建了document、navigator、screen等等屬性,此處省略 a: undefined, c: undefined, b: function(y){ var x = 1; console.log('so easy'); } }
解釋執(zhí)行代碼(直到執(zhí)行函數(shù)b)
//偽代碼 GO/window = { //變量隨著執(zhí)行流得到初始化 a: 1, c: function(){ //... }, b: function(y){ var x = 1; console.log('so easy'); } }
執(zhí)行函數(shù)b之前,發(fā)生預編譯
創(chuàng)建AO活動對象(Active Object)
查找形參和變量聲明,值賦予undefined
實參值賦給形參
查找函數(shù)聲明,值賦予函數(shù)體
//偽代碼 AO = { //創(chuàng)建AO同時,創(chuàng)建了arguments等等屬性,此處省略 y: 100, x: undefined }
解釋執(zhí)行函數(shù)中代碼
第一個腳本文件執(zhí)行完畢,加載第二個腳本文件
第二個腳本文件加載完畢后,進行語法分析
語法分析完畢,開始預編譯
重復最開始的預編譯步驟……
大家要注意,
預編譯階段發(fā)生變量聲明和函數(shù)聲明,沒有初始化行為(賦值),匿名函數(shù)不參與預編譯
只有在解釋執(zhí)行階段才會進行變量初始化
以上是“JavaScript中預編譯的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
當前文章:JavaScript中預編譯的示例分析
網(wǎng)站路徑:http://jinyejixie.com/article26/jjppjg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設、網(wǎng)站營銷、響應式網(wǎng)站、微信公眾號、網(wǎng)站建設、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)