摘要:所以變量聲明提升和函數(shù)聲明提升會出現(xiàn)一個先后順序預(yù)編譯過程結(jié)束。
先科普:
1.javaScript是解釋型語言,就是編譯一行,執(zhí)行一行.....
2.javaScript沒有塊級及作用域......
3.javaScript具有變量和函數(shù)聲明提升功能.....
4.AO對象和GO對象....
5.預(yù)編譯就是解決代碼執(zhí)行順序問題,與java語言類似(jvm)....
例如:
(function(a){ console.log(a); var a = 12; console.log(a); function a(){...} console.log(a); var b = function(){...} console.log(b); function d(){...} })(1);
1.首先創(chuàng)建一個GO對象,和AO對象....[因為該立即執(zhí)行函數(shù)是在全局作用域中執(zhí)行的,立即執(zhí)行函數(shù)執(zhí)行時創(chuàng)建AO對象]
GO{ AO{ } }
2.找形參和變量聲明,將變量和形參名作為AO屬性名,值為undefined....【變量聲明找到了a和b,其實形參也是一種變量聲明,類似于function(a,b){var a,b;},這里的形參和函數(shù)里的變量聲明a重名了,那么后一個變量聲明會被忽略...】
GO{ AO{ a: undefined, b: undefined } }
3.將實參和形參統(tǒng)一......【實參值賦值給形參】
GO{ AO{ a: 1, b: undefined } }
4.在函數(shù)體里面找函數(shù)聲明,值賦予函數(shù)體....【記住,一定是變量聲明在前,函數(shù)聲明在后。所以變量聲明提升和函數(shù)聲明提升會出現(xiàn)一個先后順序】
GO{ AO{ a: function(){...}, b: undefined, d: function(){...} } }
預(yù)編譯過程結(jié)束。
然后開始執(zhí)行:
1.執(zhí)行第一行:輸出function(){...}
2.執(zhí)行第二行賦值:
GO{ AO{ a: 12, b: undefined, d: function(){...} } }
3.執(zhí)行第三行:輸出12
4.第四行是函數(shù)聲明,預(yù)編譯已經(jīng)執(zhí)行了,跳過,執(zhí)行第五行,輸出:12
5.執(zhí)行第六行賦值:
GO{ AO{ a: 12, b: function(){...}, d: function(){...} } }
6.執(zhí)行第七行:輸出:function(){...}
7.第八行是函數(shù)聲明,跳過,執(zhí)行完成...接下來銷毀AO,再銷毀GO【這里是一個js垃圾清理過程,無關(guān)本話題】
例如:
作用域鏈......
自己本身屬性找不到就會去查找上一級的作用域中的屬性...層層迭代查詢
直到查到為止....
js是根據(jù)一個叫[[scope]]的屬性查找的,[[scope]]是任何函數(shù)(作用域都存在)都默認(rèn)自帶的屬性,它保存了一個數(shù)組值,長度是父級的總長度(作用域包裹的層級,長度至少為1),直到window為止,如果查不到,彈出錯誤...
首先[[scope]][0]保存自身預(yù)編譯AO,先查找[[scope]][0],保存了該AO或者GO....
不存在時查找[[scope]][1]...
...
注意:[[scope]]屬性不可枚舉,無法訪問...
例如:
call和apply擴(kuò)展了作用域....
apply方法可以‘借用’其他對象中的方法(簡稱A)完成屬于自己的任務(wù),A只是暫時用于自身,其本身還是別人的,你不可以去修改A中的代碼,也無法修改...
在你調(diào)用A時,apply中this指向了自身,可以這樣理解:我使用了你的方法,方法里的this指向了我,我的屬性(方法)增加了一項(擴(kuò)展了我的作用域),但是一旦退出apply時(執(zhí)行完成后),方法依然要還給你,this指向還是你,我的作用域回歸原樣....
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/94540.html
摘要:所以覺得把這個執(zhí)行的詳細(xì)過程整理一下,幫助更好的理解。類似的語法報錯的如下圖所示三預(yù)編譯階段代碼塊通過語法分析階段之后,語法都正確的下回進(jìn)入預(yù)編譯階段。另開出新文章詳細(xì)分析,主要介紹執(zhí)行階段中的同步任務(wù)執(zhí)行和異步任務(wù)執(zhí)行機(jī)制事件循環(huán)。 一、概述 js是一種非常靈活的語言,理解js引擎的執(zhí)行過程對于我們學(xué)習(xí)js是非常有必要的??戳撕芏噙@方便文章,大多數(shù)是講的是事件循環(huán)(event loo...
摘要:所以覺得把這個執(zhí)行的詳細(xì)過程整理一下,幫助更好的理解。類似的語法報錯的如下圖所示三預(yù)編譯階段代碼塊通過語法分析階段之后,語法都正確的下回進(jìn)入預(yù)編譯階段。另開出新文章詳細(xì)分析,主要介紹執(zhí)行階段中的同步任務(wù)執(zhí)行和異步任務(wù)執(zhí)行機(jī)制事件循環(huán)。 一、概述 js是一種非常靈活的語言,理解js引擎的執(zhí)行過程對于我們學(xué)習(xí)js是非常有必要的??戳撕芏噙@方便文章,大多數(shù)是講的是事件循環(huán)(event loo...
摘要:一概念是一個單線程解釋型的編程語言。預(yù)編譯大致可分為步創(chuàng)建對象找形參和變量聲明,將形參和變量名作為屬性名,值為將實參值和形參統(tǒng)一在函數(shù)體里面找函數(shù)聲明,值賦予函數(shù)體。 一、JavaScript概念 JavaScript ( JS ) 是一個單線程、解釋型的編程語言。 二、JavaScript語言特點(diǎn) 2.1 單線程 JavaScript語言的一大特點(diǎn)就是單線程,也就是說,同一個時間只能...
摘要:是動態(tài)語言,任何一段代碼在執(zhí)行之前都需要編譯,它跟傳統(tǒng)的語言不同,它不是提前編譯的,編譯結(jié)果也不能在分布式系統(tǒng)中進(jìn)行移植。通過特定方法將的轉(zhuǎn)化為一組機(jī)器指令,用來創(chuàng)建一個叫作的變量包括內(nèi)存分配等,并將一個值存儲到中。 JS 是動態(tài)語言,任何一段代碼在執(zhí)行之前都需要編譯,它跟傳統(tǒng)的語言不同,它不是提前編譯的,編譯結(jié)果也不能在分布式系統(tǒng)中進(jìn)行移植。 但是JS引擎進(jìn)行編譯的步驟和傳統(tǒng)的編譯...
摘要:預(yù)編譯發(fā)生在函數(shù)執(zhí)行前也就是說函數(shù)執(zhí)行時,預(yù)編譯已經(jīng)結(jié)束。五總結(jié)理解預(yù)編譯需要明白變量函數(shù)聲明和變量賦值。預(yù)編譯階段,只進(jìn)行變量函數(shù)聲明,不會進(jìn)行變量的初始化即變量賦值,所有變量的值都是變量賦值是在解釋執(zhí)行階段才進(jìn)行的。 一、JS的概念 JavaScript ( JS ) 是一種具有函數(shù)優(yōu)先的輕量級解釋型或即時編譯型的編程語言。 二、JS語言特點(diǎn) 2.1 單線程 (1)JavaScri...
閱讀 1961·2021-11-15 17:58
閱讀 2141·2021-10-19 11:45
閱讀 3511·2021-09-02 15:40
閱讀 2606·2021-07-25 10:50
閱讀 3758·2019-08-30 15:56
閱讀 3158·2019-08-30 12:44
閱讀 1040·2019-08-26 13:38
閱讀 1883·2019-08-23 18:29