[英]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.