[英]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 調用,就會創建一個新的執行上下文
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.