這篇文章將為大家詳細(xì)講解有關(guān)javascript中預(yù)編譯指的是什么意思,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
公司專注于為企業(yè)提供成都網(wǎng)站建設(shè)、網(wǎng)站制作、微信公眾號(hào)開發(fā)、電子商務(wù)商城網(wǎng)站建設(shè),微信小程序定制開發(fā),軟件定制制作等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。憑借多年豐富的經(jīng)驗(yàn),我們會(huì)仔細(xì)了解各客戶的需求而做出多方面的分析、設(shè)計(jì)、整合,為客戶設(shè)計(jì)出具風(fēng)格及創(chuàng)意性的商業(yè)解決方案,創(chuàng)新互聯(lián)建站更提供一系列網(wǎng)站制作和網(wǎng)站推廣的服務(wù)。
在JavaScript中,預(yù)編譯就是代碼執(zhí)行前進(jìn)行的一項(xiàng)操作,會(huì)把變量聲明提前,函數(shù)聲明也提前,把這些按照一定的規(guī)則,放在創(chuàng)建的對(duì)象里面去的一個(gè)過程。
本教程操作環(huán)境:windows10系統(tǒng)、javascript1.8.5版、Dell G3電腦。
js運(yùn)行三部曲
1.語(yǔ)法分析 : js引擎在解析js代碼之前,會(huì)先通篇掃描一下,找出低級(jí)的語(yǔ)法錯(cuò)誤,比如寫錯(cuò)大括號(hào)之類的。
2.預(yù)編譯 任何的語(yǔ)法和語(yǔ)句全部會(huì)被轉(zhuǎn)換成對(duì)象,GO(Global Object),AO(Active Object)把代碼按照 一定的規(guī)則,放到GO和AO中
3.解釋執(zhí)行 編譯一行執(zhí)行一行,當(dāng)語(yǔ)法分析沒有問題,并且已經(jīng)完成預(yù)編譯階段之后,就開始解釋執(zhí)行代碼
什么的預(yù)編譯?
預(yù)編譯就是在JavaScript代碼前進(jìn)行的一項(xiàng)操作會(huì)把變量聲明提前,函數(shù)聲明也提前,把這些代碼按照一定的規(guī)則,放在創(chuàng)建的對(duì)象里面去。
預(yù)編譯的過程:
GO window預(yù)編譯
1,在執(zhí)行script標(biāo)簽的一瞬間創(chuàng)建一個(gè)GO對(duì)象
2,尋找變量聲明,變量名作為GO對(duì)象的屬性名,值為undefined。
3,尋找函數(shù)聲明,函數(shù)名作為GO對(duì)象的屬性名,值為函數(shù)體,如果函數(shù)名和變量名一樣,直接覆蓋
AO 函數(shù)預(yù)編譯
1,在函數(shù)執(zhí)行的一瞬間創(chuàng)建一個(gè)AO對(duì)象
2,尋找實(shí)參和形參,將形參作為AO對(duì)象的屬性名添加到對(duì)象中,值為實(shí)參,值得注意的是,函數(shù)聲明不叫變量。如果沒有實(shí)參值就是undefined。
3,尋找變量聲明,變量名作為AO對(duì)象的屬性名,值為undefined。如果變量名和形參名一樣不用管。
4 ,尋找函數(shù)聲明,函數(shù)名作為AO對(duì)象的屬性名,值為函數(shù)體,如果函數(shù)名和變量名一樣,直接覆蓋
下面我們來寫一段代碼來簡(jiǎn)單介紹一哈函數(shù)預(yù)編譯的過程
function fun(a,b){ console.log(a); var a = 10; console.log(a); function a(){} console.log(a) a = 1; var b; console.log(b); var b = function(){} console.log(b); } fun(1,2);
1首先在執(zhí)行fun之前會(huì)創(chuàng)建一個(gè)AO對(duì)象。
funAO{ }
2,尋找實(shí)參和形參,將形參作為AO對(duì)象的屬性名添加到對(duì)象中,值為實(shí)參,值得注意的是,函數(shù)聲明不叫變量。如果沒有實(shí)參值就是undefined。
funAO{ a : 1, b : 2 }
3,尋找變量聲明,變量名作為AO對(duì)象的屬性名,值為undefined。如果變量名和形參名一樣不用管
funAO{ a : 1, b : 2 }
4 ,尋找函數(shù)聲明,函數(shù)名作為AO對(duì)象的屬性名,值為函數(shù)體,如果函數(shù)名和變量名一樣,直接覆蓋
funAO{ a : function a(){}, b : 2 }
解釋執(zhí)行
function fun(a,b){ console.log(a); //往上面的AO對(duì)象里面尋找,a的值是function a(){}。 這里就輸出function a(){} var a = 10; console.log(a);//上面一行代碼把a(bǔ)賦值10 ,所以這里輸出10 function a(){} console.log(a)//這里也是10,因?yàn)樯厦婧瘮?shù)已經(jīng)提前了 a = 1; var b; console.log(b);//往上面的AO對(duì)象里面尋找,b的值是2。 這里就輸出2 var b = function(){}//這里的函數(shù)為啥不能提前,因?yàn)檫@里的是一個(gè)函數(shù)表達(dá)式,這個(gè)函數(shù)沒有函數(shù)名所以不能提前。 console.log(b);//這里把b賦值function(){},所以這里輸出function(){} } fun(1,2);
還有一種可能
function add(){ //這里的話碰到if判斷,for....除了function作用域之外的咱們都得正常分析, //所以這里的值為undefined其實(shí)就是var a提前了賦值undefined console.log(a);//這里的輸出結(jié)果為?undefined if(a){ var a = 10; } //這里是把a(bǔ)的值傳入判斷里面undefined返回的是false所以進(jìn)不去,值就不會(huì)改變這里還是undefined console.log(a);//undefined } add();
這上面就是預(yù)編譯的執(zhí)行過程!
關(guān)于“javascript中預(yù)編譯指的是什么意思”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
標(biāo)題名稱:javascript中預(yù)編譯指的是什么意思
地址分享:http://m.newbst.com/article48/jesgep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、微信公眾號(hào)、響應(yīng)式網(wǎng)站、品牌網(wǎng)站制作、動(dòng)態(tài)網(wǎng)站、網(wǎng)站營(yíng)銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)