簡體   English   中英

在Java Script中注冊變量和函數聲明

[英]Registering Variables and Functions Declarations in Java Script

我正在觀看一個關於javascript范圍的視頻,它說在瀏覽器解釋java腳本代碼之前,它實際上涉及一個快速的編譯步驟(很可能不是'編譯',因為它不涉及制作中間文件),它注冊變量和功能聲明在各自的范圍內。 所以,如果我寫:

var a = 3;
function foo(){
var c = 2;
}

在評估上述表達式(即忽略RHS部分)之前,變量'a'和函數'foo'將在全局范圍內注冊,並且在'foo'范圍內,變量'c'將被注冊。 在此編譯步驟之后,將評估表達式的值。

但是當我們寫下時會發生什么:

var a = function(){
var c;
}

編譯步驟是否只在全局范圍內注冊變量'a'並跳過函數聲明和變量'c'聲明,因為編譯步驟應該跳過RHS部分並且評估表達式出現在解釋器部分?

實際上,我后來想通了。 這是吊裝。 提升僅適用於變量和函數聲明,而不適用於函數表達式。 事實證明,函數表達式及其局部變量中唯一的函數被注冊的時間是java腳本解釋器運行時(編譯后),因為編譯步驟不會打擾它們,因為它們位於RHS部分。 這確保了在函數表達式的情況下,我們只在賦值后調用它,並且解釋器負責在全局范圍中注冊的函數,將它分配給LHS變量並聲明其局部變量(var bar;):

 var foo = function() { console.log(bar); var bar = 5; }; foo(); 

僅當解釋器到達此行時才會創建此函數對象:

var foo = function abc() {

這是一個函數聲明的例子,如下所示:

 foo(); function foo() { console.log(bar); var bar = 5; } 

吊裝會確保在編譯步驟中它注冊函數'foo'並在其范圍內聲明變量'bar'。

盡管如此,這兩個項目都會給出相同的輸出 - “未定”。

暫無
暫無

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

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