簡體   English   中英

JavaScript中的內部函數是否被吊起? 作用域規則如何應用於它們?

[英]Do inner functions in JavaScript get hoisted? How do the scoping rules apply to them?

我以為JavaScript沒有塊范圍,而是函數范圍,並且聲明從其塊提升到了父函數的頂部。

但是,以下代碼無法正常工作:

function one(a) {
    console.log("one called for " + a);

    if (a == 1) {
        function inner(b) {
            console.log("inner called for " + b);
        }

        inner(123);
    }

    inner(456);
}

one(1);
one(2);
one(3);

one(1); 調用正常進行,沒有任何錯誤,但是在第二one(2);時執行停止one(2); 叫做。

此行為很直觀:僅當a==1時才定義函數inner

但是,它與范圍/吊裝規則如何一致?

我認為它的定義將被提升到它的作用域的頂部,在應該沒有作用的if塊之外!

編輯:這是我得到的錯誤:

顯示錯誤的Firefox控制台的屏幕截圖

瀏覽器是Firefox。 在這里擺弄。

 if (…) { function …() { … } } 

無效的ECMAScript。 函數聲明必須在函數或程序主體的頂層,在塊內部, 其行為取決於實現 Firefox確實有條件地執行此函數語句 ,其他瀏覽器確實像常規函數聲明那樣提升它。 將其移至if語句之外,或分配一個函數表達式。

inner的聲明被提升到外部函數的頂部。 但是,僅當a == 1時才設置其值。

outer()被調用一個不同的值,調用inner(456)失敗作為inner仍然被設置為undefined

暫無
暫無

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

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