我正在努力解决范围界定问题。根据我的理解,ES5 没有阻塞作用域的能力,因此,内部 f() 应该在主体测试的范围内。

这些是运行该函数的结果

  • 测试(真);//["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 还有一个功能叫做: strict mode 。这是在语言的最初开发之后实现的,以强制执行一些最佳实践和一些规则,以防止开发人员基于其他具有类似语法的语言对他们认为该语言的工作方式做出错误的假设。在这种情况下,严格模式实际上改变了新的 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 的新声明仅适用于定义它的条件。

    关于javascript - JavaScript 和内部函数中的块作用域,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41149071/

    10-10 14:07
    查看更多