簡體   English   中英

嵌套塊作用域中的 Function 聲明

[英]Function declaration in nested block scopes

與此參考一樣,Function 聲明語句和變量聲明沒有塊 scope 所以我問為什么下面的代碼以這種方式執行。

 //javascript es6 { function bar() { console.log("1"); } } function bar() { console.log("2"); } bar(); //prints "1" not "2" this.bar() //also prints "1" not "2"

我所知道的是,上面的代碼應該考慮全局 scope 中的兩個函數,但似乎 function 聲明受到塊 scope 的影響。

基本上,function 聲明在代碼執行之前運行。 讓我試着讓它更清楚。

讓我們先將這些函數重命名為這個,這樣我就可以更好地解釋它是如何工作的:

 { function bar() { console.log("1"); } } function foo() { console.log("2"); }

您的編譯器所做的是掃描您的 js 文件並看到有一個 function 聲明,即 foo function (忽略括號內的那個)。 然后它像往常一樣運行 js 文件,進入你的括號內並看到在 foo() function 之后聲明的另一個 function 聲明(bar() 函數)。

所以基本上,這就是你會得到的結果:

 bar() // returns "2" { function bar() { console.log("1") } } bar() // returns "1" function bar() { console.log("2") } bar() // returns "1"

我希望這是有道理的。

有關更多信息,請嘗試查找function 表達式與 function 聲明以及查看 javascript 編譯器的工作原理,這將使您更好地了解提升的工作原理。

看起來這個問題是由於 javascript 吊裝造成的。 出於某種原因,據我所知,在 scope 塊中聲明您的 function 會改變它被提升的方式。 在此處閱讀更多信息: https://www.w3schools.com/js/js_hoisting.asp

暫無
暫無

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

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