闭合意味着什么?

时间:2014-09-27 23:09:10

标签: javascript

我已多次阅读有关闭包here

但我确实很难确切知道封闭意味着什么?

  • 变量是封闭的吗?
  • 或者,功能是闭包吗?
  • 或者,两者都可以称为闭包?

1 个答案:

答案 0 :(得分:2)

闭包是变量的容器,它允许函数从创建它的作用域访问变量,即使它在不同的作用域中被调用。

示例:

function a() {
  // a local variable
  var x = 42;
  function f() {
    // use the local variable
    return x;
  }
  // return the function f
  return f;
}

// call a to get the inner function
var fx = a();
// call the inner function from out here
var y = fx();
// now y contains the 42 that was grabbed from the variable x inside the function

当创建函数f时,它有一个闭包,它包含来自创建它的作用域的变量x。当从全局范围调用该函数时,它仍然可以从本地范围访问变量x,就像它在闭包中一样。

您可以通过将变量放在对象中来模拟闭包的功能,并将其与函数一起发送,以便函数可以在以后使用它:

function a() {
  // a "closure"
  var o = { x: 42 };
  function f(closure) {
    // use the "closure"
    return closure.x;
  }
  // return the "closure" and the function f
  return { f: f, o: o };
}

// call a to get the inner function and the "closure"
var fx = a();
// call the inner function with the "closure"
var y = fx.f(fx.o);
// now y contains the 42 that was grabbed from the variable x in the "closure"

注意:闭包包含作用域中的任何标识符,因此在第一个示例中,函数f的闭包还包含作为函数的标识符f。该函数可以从任何地方使用名称f调用自身,但标识符f是函数a的本地名称。