摘要:一概念是一個單線程解釋型的編程語言。預編譯大致可分為步創(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
摘要:詞法作用域是一種靜態(tài)作用域這個例子的結(jié)果按靜態(tài)作用域來分析執(zhí)行函數(shù),先從函數(shù)內(nèi)部查找是否有局部變量,如果沒有,就根據(jù)書寫的位置,查找上面一層的代碼,也就是等于,所以結(jié)果會打印。靜態(tài)作用域,決定的是作用域鏈的順序。 博客原文地址:https://finget.github.io/2018/03/01/javascriptPrecompile/看不明白的地方歡迎提問,有理解的不對的地方希望...
摘要:預編譯發(fā)生在函數(shù)執(zhí)行前也就是說函數(shù)執(zhí)行時,預編譯已經(jīng)結(jié)束。五總結(jié)理解預編譯需要明白變量函數(shù)聲明和變量賦值。預編譯階段,只進行變量函數(shù)聲明,不會進行變量的初始化即變量賦值,所有變量的值都是變量賦值是在解釋執(zhí)行階段才進行的。 一、JS的概念 JavaScript ( JS ) 是一種具有函數(shù)優(yōu)先的輕量級解釋型或即時編譯型的編程語言。 二、JS語言特點 2.1 單線程 (1)JavaScri...
摘要:借助語法樹,開發(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ù),還能進一步實...
摘要:我們對語句做適當改變,就完成了注入,因為普通的不會對做任何處理,該例中單引號后的生效,拉出了所有數(shù)據(jù)。查詢資料后,發(fā)現(xiàn)還要開啟一個參數(shù),讓端緩存,緩存是級別的。結(jié)論是個好東西。 背景 最近因為工作調(diào)整的關(guān)系,都在和數(shù)據(jù)庫打交道,增加了許多和JDBC親密接觸的機會,其實我們用的是Mybatis啦。知其然,知其所以然,是我們工程師童鞋們應(yīng)該追求的事情,能夠幫助你更好的理解這個技術(shù),面對問題...
閱讀 3846·2021-11-24 09:39
閱讀 3767·2021-11-22 12:07
閱讀 1116·2021-11-04 16:10
閱讀 810·2021-09-07 09:59
閱讀 1908·2019-08-30 15:55
閱讀 948·2019-08-30 15:54
閱讀 735·2019-08-29 14:06
閱讀 2484·2019-08-27 10:54