簡體   English   中英

JavaScript 具體function吊裝

[英]JavaScript specific function hoisting

我想具體知道什么功能在吊裝時首先出現。 它們是否與開始時一樣:

var z;
function b(){}
function a(){}

會成為

function b(){}
function a(){}
var z;

還是它做其他事情? 這對調用其他函數的函數有何影響?

var z;
function b(){a();}
function a(){}

知道成為

function a(){}
function b(){a();}
var z;

還是我錯過了什么?

MDN中所述:

One of the advantages of JavaScript putting function declarations into memory before it executes any code segment is that it allows you to use a function before you declare it in your code.

所以..是的 - 在任何實際的 function 調用之前,您的函數會加載到 memory 中。 例如:

function b() { console.log('b'); a() }
b()
function a() { console.log('a')}

將正確調用 function a盡管b function 調用(在第 2 行中)放置在 function a的聲明之前

作為旁注..請盡量避免變量中的這種行為,因為您最終可能會將變量附加到全局 scope 或“范圍冒泡”的風險(使用此鏈接了解更多詳細信息)

吊裝前

var z;
function b(){a();}
function a(){}

吊裝后

reference to b;
reference to a;
z = undefined;

輸入b function 后,您將能夠毫無問題地a function。

JS 引擎在執行任何代碼時執行以下兩個步驟:

創作階段

  • JS 引擎解析 - 運行您的代碼並識別代碼創建的變量和函數(將在執行階段使用)
  • 為變量和函數設置 memory 空間 - “提升”
  • 提升 - 在執行代碼之前,JS 引擎為代碼中使用的 Var 和 Func 留出 memory 空間。 這些變量和函數構成了任何被執行的 function 的執行上下文。 JS 中的所有變量最初都設置為未定義。

執行階段:很容易理解,

  • 當代碼逐行執行時(由 JS 解釋器),它可以訪問在執行上下文中定義的變量
  • 變量賦值在這個階段完成

只要存在 function 調用,就會創建一個新的執行上下文

鏈接到帖子 - https://stackoverflow.com/a/44748585/7291317

function 和變量聲明都被提升,但函數聲明在變量之前被提升。

所以你的代碼:

var z;
function b(){}
function a(){}

JS引擎編譯后會變成:

function b(){}
function a(){}
var z;

現在的問題是下面的代碼可以正常工作嗎?

var z;
function b(){a();}
function a(){}

在上面的代碼中function a a 在聲明之前在function b中被調用。 JS 引擎分兩個階段工作,首先是編譯階段,在這個階段會發生所有提升,其次是執行階段,在這個階段會發生執行。

因此,當您調用function a (最終將在執行階段發生)時,將在編譯階段聲明function a之后發生。

例如。

當你寫:

console.log(a); // undefined cause var a; is declared first 

var a = 10;

上面的代碼將被 JS 引擎解釋為,

var a ;

console.log(a); // undefined;

a = 10;

有關吊裝的更多信息。

暫無
暫無

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

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