簡體   English   中英

JavaScript和內部函數的塊作用域

[英]Block scoping in JavaScript and inner functions

我正在努力確定范圍。 根據我的理解,ES5不具有大范圍監視的功能,因此,內部f()應該屬於身體測試的范圍。

這些是運行該功能的結果

  • 測試(true); // [“ local”,“ local”]
  • test(false)// f未定義

但是,我不明白為什么test(false)會給出錯誤? 我期待-[本地]。

  function f() { return "global"; }

    function test(x) {
        var result = [];
        if (x) {
            function f() { return "local"; } // block-local

            result.push(f());
        }
        result.push(f());
        return result;
    }

這是您的代碼在編譯時的實際外觀:

function f() { return "global"; }

    function test(x) {
        var result = [];
        var f; 
        if (x) {
            f = function () { return "local"; } // block-local

            result.push(f());
        }
        result.push(f());
        return result;
    }

f變量(包含函數指針的變量)在函數頂部聲明,但在條件變量中定義。

JavaScript還具有一個稱為嚴格模式的功能。 這是在該語言的原始開發之后實施的,以實施一些最佳實踐和一些規則,以防止開發人員對基於其他類似語法的語言的工作方式做出錯誤的假設。 在這種情況下,嚴格模式實際上會更改新f函數的作用域。

如下代碼:

function f() { return "global"; }

    function test(x) {
    "use strict" // STRICT MODE TAG INSERTED HERE
        var result = [];
        if (x) {
            function f() { return "local"; } // block-local

            result.push(f());
        }
        result.push(f());
        return result;
    }

test(true);
test(false);

產生以下結果:

["local","global"] //test(true);

["global"] //test(false);

它會覆蓋默認的作用域規則,並確保f的新聲明僅適用於定義它的條件內。

這是因為當您的條件為true時,'f'是一個函數聲明,因此它將檢查內部的f函數。

當x為false時,由於看不見'f',因此會引發錯誤,並且無法看到全局'f'函數,因為f已在本地局部被覆蓋

要覆蓋它,您可以顯式調用window.f()或將if條件內的f()設置為IIFE

檢查這些片段

 function f() { return "global"; } function test(x) { var result = []; if (x) { // block-local result.push((function f() { return "local"; })()); } result.push(f()); return result; } var res = test(true); console.log(res); var res1 = test(false); console.log(res1); 

希望能幫助到你

暫無
暫無

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

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