成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript的預編譯過程分析

graf / 3297人閱讀

摘要:一概念是一個單線程解釋型的編程語言。預編譯大致可分為步創(chuàng)建對象找形參和變量聲明,將形參和變量名作為屬性名,值為將實參值和形參統(tǒng)一在函數(shù)體里面找函數(shù)聲明,值賦予函數(shù)體。

一、JavaScript概念

JavaScript ( JS ) 是一個單線程、解釋型的編程語言。

二、JavaScript語言特點 2.1 單線程

JavaScript語言的一大特點就是單線程,也就是說,同一個時間只能做一件事。

2.2 解釋型語言

自上而下,解釋一行,執(zhí)行一行;不會通篇編譯為一個文件再執(zhí)行。

三、 JavaScript執(zhí)行過程 3.1 語法分析

顧名思義 就是檢查一遍js代碼內(nèi)有沒有出現(xiàn)語法錯誤(比如少些個分號,多寫個括號等);語法分析期間不會執(zhí)行代碼

3.2 預編譯

預編譯發(fā)生在函數(shù)執(zhí)行的前一刻
全局下:
全局的變量聲明和函數(shù)聲明則會存放在全局對象內(nèi)(Global Object 簡稱GO,它是window的一部分,你可以直接把他理解成window對象)中
函數(shù)體內(nèi):
預編譯會提前把函數(shù)里的變量聲明和函數(shù)聲明依據(jù)規(guī)則存放在該活動對象內(nèi)(Activation Object,簡稱AO),

預編譯簡單理解就是在內(nèi)存中開辟一些空間,存放一些變量與函數(shù) 。

預編譯大致可分為4步:

創(chuàng)建AO(GO)對象

找形參和變量聲明,將形參和變量名作為AO(GO)屬性名,值為undefined

將實參值和形參統(tǒng)一

在函數(shù)體里面找函數(shù)聲明,值賦予函數(shù)體。

所以如果遇到下面這種情況,當函數(shù)聲明和變量聲明名稱相同時:

console.log(a); 
var a= 1;
function a(){};

編譯后的代碼其實是:

var a;
function a(){};
console.log(a);
a= 1;

所以最后輸出的是:

function a() {}
預編譯小節(jié)

預編譯兩個小規(guī)則

函數(shù)聲明整體提升—(具體點說,無論函數(shù)調(diào)用和聲明的位置是前是后,系統(tǒng)總會把函數(shù)聲明移到調(diào)用前面)

變量 聲明提升—(具體點說,無論變量調(diào)用和聲明的位置是前是后,系統(tǒng)總會把聲明移到調(diào)用前,注意僅僅只是聲明,所以值是undefined),只有在解釋執(zhí)行階段才會進行變量初始化,匿名函數(shù)不參與預編譯。

預編譯前奏

imply global 即任何變量,如果未經(jīng)聲明就賦值,則此變量就位全局變量所有(全局域就是window) 。

一切聲明的全局變量,全是window的屬性。

3.3 解釋執(zhí)行

預編譯完畢之后,JavaScript 腳本開始執(zhí)行,執(zhí)行順序按照從上到下的順序執(zhí)行。

總結(jié)

JavaScript執(zhí)行順序

語法分析

預編譯
2.1. 創(chuàng)建AO(GO)對象
2.2. 找形參和變量聲明,將形參和變量名作為AO(GO)屬性名,值為undefined
2.3. 將實參值和形參統(tǒng)一
2.4. 在函數(shù)體里面找函數(shù)聲明,值賦予函數(shù)體。

解釋執(zhí)行

練習:

function a(a){
    console.log(a);
    a= 2;
    console.log(b);
    var b= 3;
    console.log(a);
}
a(1);
console.log(a);

你可以先試想一下結(jié)果,然后復制代碼到控制臺去驗證你的答案是否正確。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/99921.html

相關(guān)文章

  • JavaScript的預編譯過程與作用域

    摘要:詞法作用域是一種靜態(tài)作用域這個例子的結(jié)果按靜態(tài)作用域來分析執(zhí)行函數(shù),先從函數(shù)內(nèi)部查找是否有局部變量,如果沒有,就根據(jù)書寫的位置,查找上面一層的代碼,也就是等于,所以結(jié)果會打印。靜態(tài)作用域,決定的是作用域鏈的順序。 博客原文地址:https://finget.github.io/2018/03/01/javascriptPrecompile/看不明白的地方歡迎提問,有理解的不對的地方希望...

    ziwenxie 評論0 收藏0
  • JavaScript-預編譯

    摘要:預編譯發(fā)生在函數(shù)執(zhí)行前也就是說函數(shù)執(zhí)行時,預編譯已經(jīng)結(jié)束。五總結(jié)理解預編譯需要明白變量函數(shù)聲明和變量賦值。預編譯階段,只進行變量函數(shù)聲明,不會進行變量的初始化即變量賦值,所有變量的值都是變量賦值是在解釋執(zhí)行階段才進行的。 一、JS的概念 JavaScript ( JS ) 是一種具有函數(shù)優(yōu)先的輕量級解釋型或即時編譯型的編程語言。 二、JS語言特點 2.1 單線程 (1)JavaScri...

    Aldous 評論0 收藏0
  • 開發(fā)者的進階之路:用語法樹來實現(xiàn)預編譯

    摘要:借助語法樹,開發(fā)者能夠更好地展現(xiàn)和修改源程序代碼,優(yōu)化開發(fā)環(huán)節(jié),提高安全系數(shù),還能進一步實現(xiàn)安卓預編譯。用語法樹來實現(xiàn)預編譯指令開發(fā)者還能用語法樹來實現(xiàn)預編譯指令,常見的預編譯指令主要分為條件編譯宏定義文件包含三大類。 如何在保證安全性的前提下,提升開發(fā)過程的效率,是每個開發(fā)者都在不斷探索的問題。借助語法樹,開發(fā)者能夠更好地展現(xiàn)和修改源程序代碼,優(yōu)化開發(fā)環(huán)節(jié),提高安全系數(shù),還能進一步實...

    CoffeX 評論0 收藏0
  • 【JDBC系列】從源碼角度理解JDBC和Mysql的預編譯特性

    摘要:我們對語句做適當改變,就完成了注入,因為普通的不會對做任何處理,該例中單引號后的生效,拉出了所有數(shù)據(jù)。查詢資料后,發(fā)現(xiàn)還要開啟一個參數(shù),讓端緩存,緩存是級別的。結(jié)論是個好東西。 背景 最近因為工作調(diào)整的關(guān)系,都在和數(shù)據(jù)庫打交道,增加了許多和JDBC親密接觸的機會,其實我們用的是Mybatis啦。知其然,知其所以然,是我們工程師童鞋們應(yīng)該追求的事情,能夠幫助你更好的理解這個技術(shù),面對問題...

    longshengwang 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<