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