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

时间:2015-02-21 21:23:58

标签: javascript

以下代码是否会形成闭包?

function f() {}

定义此函数的位置会影响答案吗?

4 个答案:

答案 0 :(得分:4)

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

闭包是函数引用和创建函数的环境的组合。无论函数如何被调用,函数中的代码总是可以访问创建函数的作用域中定义的任何变量。

实施例;函数f将始终使用变量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

答案 1 :(得分:1)

当函数在其词法范围内引用变量时,您创建一个闭包:

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

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

答案 2 :(得分:0)

是的,它始终定义一个闭包,无论它在何处定义。这个tutorial有一些说明性的例子。

答案 3 :(得分:-1)

因为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"福音传道者使用"识别那些在实际闭包中没有被捕获的功能 - 这是从基本操作的角度来说这是正确的方法。原因可能是由于缺乏一个更好的术语而不是其他任何东西。