代码之家  ›  专栏  ›  技术社区  ›  Ben Aston

一个简单的函数声明会在JavaScript中形成闭包吗?

  •  5
  • Ben Aston  · 技术社区  · 11 年前

    以下代码会形成闭包吗?

    function f() {}
    

    此函数的定义位置是否影响答案?

    4 回复  |  直到 11 年前
        1
  •  4
  •   Guffa    11 年前

    是的,它形成了一个封闭。

    闭包是函数引用和创建函数的环境的组合。无论如何调用函数,函数中的代码始终可以访问在创建函数的范围中定义的任何变量。

    实例函数 f 将始终使用变量 x 即使在以下范围中调用 x(x) 无法访问:

    function container() {
    
      var x = 42;
    
      function f() {
        document.write(x);
      }
    
      return f;
    
    }
    
    var func = container();
    func(); // displays 42
    //document.write(x); // would give an error as x is not in scope
        2
  •  0
  •   Loic Dachary    11 年前

    是的,它总是定义闭包,无论它在哪里定义。这 tutorial 有几个说明性的例子。

        3
  •  0
  •   elclanrs    11 年前

    当函数在其词法范围中引用变量时,可以创建闭包:

    var a = 'foo'
    function f() {} // no closure
    function f() {return a} // closure
    

    如果您放置 debugger 语句,您可以在Chromedevtools中看到闭包包含的内容。您将看到第一个示例没有任何内容,而第二个示例将显示 a: 'foo'

        4
  •  -1
  •   bug-a-lot    10 年前

    因为javascript是一种特殊的语言(参见范围、提升和最近的TDZ),根据您在问题中的具体程度,您可能会得到不同的答案。

    它是javascript闭包吗?否。请参见Mozilla的定义 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures

    它是在闭包中捕获的(还是形成闭包-最初的问题)?取决于优化。但很可能是的。看见 http://dmitrysoshnikov.com/ecmascript/chapter-6-closures/ 更重要的是 https://en.wikipedia.org/wiki/Closure_%28computer_programming%29

    javascript“福音传道者”使用闭包术语来标识那些如果没有在实际闭包中捕获到就无法正常工作的函数——从根本操作的角度来说,这是正确的说法。原因可能是缺少更好的术语,而不是其他任何原因。