簡體   English   中英

完整代碼或嵌套功能級別是否一次進行提升

[英]Does hoisting takes place at once for the full code or by nested-function-levels

大家好 我不了解有關起重裝置的某些信息,可能是我的問題,但我沒有找到任何答案,無論是在這里還是在Google上,這都是我想問的,感謝您的閱讀。

所以我不明白,隨着javascript引擎在下面獲取我的代碼並開始進行掃描,是否會將包含所有函數和嵌套函數的整個代碼扔到最后一個范圍? 並且所有功能的創建階段都將在第一次掃描時進行(或者換句話說,整個代碼將只被掃描一次並為每個功能准備好一切)?

 /* Global execution context*/ function myFirst(){ /*Scanner meets this code and hoists it*/ var A = "12" return function myFirstB(){ /*As the scanner arrived here and scanns threw this function during the parents hoisting period ( or just before the global contexts execution phase) will it be hoisted as well, that it gets [[Scopes]] property? So that when I call it in the last line as a closure, it can remember on, that variable "A" is in its outer-environment?*/ console.log(A) } //myFirstB() } // myFirst() function mySecond(){ alert("one") } var myClosure = myFirst(); myClosure(); /*before beeing called does this function have already [[Scopes]] property/scope-chain?*/ 

還是吊運是逐層進行的? 因此,我的意思是說,首先要提升那些在全局范圍內定義的功能? 然后,當其中一個函數被調用並且其執行上下文的執行階段開始時,將嵌套其嵌套函數嗎?

我正在對此進行調查,因為我不太了解嵌套函數是如何記住的,如果至少尚未舉起,則在其中定義了詞匯環境/函數(如果至少尚未提升),它具有[[Scopes]]屬性,該屬性可以保留其范圍鏈

該問題是直到現在為止我所看到的所有文章,甚至ecmascript 6文檔也只說過,如果掃描程序滿足功能定義a,然后使用范圍鏈和變量對象,參數對象和“ this”關鍵字,但是,如果嵌套的函數(保留在變量對象中,並在內存中引用了它們的函數體)也不會被提升,那么我沒有找到任何可以討論的材料(同時,其父函數已被吊起),因此,如果從那里的外部環境中調用它們,它們將獲得一個范圍鏈以記住其外部環境

非常感謝許多人閱讀我投入的大量文字,如果您能回答,或者您有一篇文章談論這方面以及吊裝,我真的很高興

我認為您很困惑,因為您糾結了太多東西。 您將需要區分三件事:

  • 解析器做什么
  • 創建范圍時會發生什么
  • 運行代碼時會發生什么

解析器確實確實掃描了整個代碼。 如果任何地方都存在語法錯誤,則不會運行任何代碼。 它確實將整個代碼解析為一個(嵌套的)結構,該結構適合以后執行。 這可能是抽象的語法樹或可執行的字節碼,或兩者之間的任何內容-這是實現細節。

在運行代碼塊之前,例如在全局作用域,塊作用域或函數作用域中,必須先創建和初始化該執行的上下文。 它確實獲得了父作用域引用(例如,圍繞塊的作用域或在其中定義了閉合的作用域),一個this值以及一個在其中創建該作用域的變量的新變量環境。 這里是在范圍內聲明的所有變量名(例如,函數參數, varfunction以及letconstclass聲明等)用於實例化新變量的地方。

當執行代碼塊時,對於語句的語句和對於表達式的表達式,變量已經存在。 這是創建值並將其分配給變量的時間。 定義一個函數時,通過引用當前作用域,它確實成為一個閉包。

術語“吊裝” 給人以錯誤的印象 不會移動任何源代碼。 實現方式如何實現指定的行為不受限制。 解析器可能創建了字節代碼,該字節代碼在每個作用域的頂部都有變量的創建。 可能是在范圍的初始化階段,它每次都掃描AST以查找聲明。 它很可能是即時編譯器形式的混合形式,僅在首次調用該函數時才創建字節碼。

關於嵌套函數的問題,請記住,每次調用外部函數時都會重新創建內部函數。 它僅“提升”到其作用域的頂部,而不在外部函數之外,並且將在每次運行代碼時重新定義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM