簡體   English   中英

如何在JavaScript中提升?

[英]How is hoisting possible in JavaScript?

如果它是一種解釋語言, JavaScript如何執行提升 解釋型語言不是逐行從上到下執行代碼。 是否有任何類型的編譯在后台工作?

“解釋”並不意味着每一行在讀取時都會立即執行。 Javascript解釋器首先讀取整個文件 ,在此過程中,它將信息解析為可執行代碼。 吊裝正在這里發生: 解析執行之間。


簡而言之,非常簡化,吊裝工作如下:

  • 解析器/解釋器將源代碼讀入中間表示
  • 一些關鍵字引入了新的范圍(例如function ),為此將創建一個新的“范圍對象”*
  • 如果在解析范圍期間解析器遇到var關鍵字(或其他相關關鍵字),它會在當前范圍上創建該符號名稱(沒有值/ undefined

*這里不要過多地閱讀“對象”這個詞,它不是我們談論的Javascript,而是正在編譯中間語言Javascript。

因此,在此過程之后,您將獲得源代碼的一些中間表示,其中定義了作用域並在其上保留了本地符號名稱。 這就是在任何代碼實際執行之前,變量名稱被提升到“頂部”的方式。

解釋語言/腳本語言不僅僅是從上到下執行。 “解釋語言”或“腳本語言”的意思是沒有編譯二進制或相等。 您編寫文本並直接執行此腳本。

根據您選擇的語言,它將具有functionsclasses甚至loops ,然后它開始不僅僅是從上到下執行。

該腳本分兩個階段執行,在第一階段,解釋器將讀取整個文件,並只執行每個表達式的左側定義......

var x = 5

這里,在第一階段,解釋器將執行左側var x ,因此它將找到當前范圍並定義一個名為x的變量。

在第二階段,它將執行表達式的右側x將等於5

這就是在JavaScript中完成提升的方式。


所以在JS中你可以用兩種方式定義一個函數:

  • 函數聲明:(函數由function關鍵字定義)因此它在左側,並將被提升。
  • 函數表達式:(函數通過將函數賦值給變量來定義),因此變量只會被提升,賦值將處於第二階段。

所以讓我們展示一下:

// This example will work
test();
function test () {
    alert('test');
}

和,

// This example will raise an error
test();
var test = function () {
    alert();
}

因為在第二個示例中, test將等於undefined ,因為該函數尚未分配給test變量。

暫無
暫無

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

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