23

如何理解 Javascript 中的闭包?

一般而言,闭包是绑定到一个或多个外部变量的函数。当它被调用时,该函数能够访问这些变量。在 JavaScript 中,当函数在另一个函数中声明时,通常会实现闭包。内部函数访问父函数的变量,即使在父函数终止后

在这句话中,“闭包是绑定到一个或多个外部变量的函数”,这是否意味着我们可以这样做:对var myFun = Function(msg){...};吗?

“即使在父函数终止之后”是什么意思?

4

3 回答 3

9

闭包是绑定到一个或多个外部变量的函数

这个概念的一个例子是函数 bar 绑定到外部变量 x、y 和 z:

function foo(x, y) {
  var z = 3;

  return function bar(a, b, c) {
    return (a + b + c) * (x + y + z);
  };
}

var closure = foo(1, 2);
closure(5, 6, 7); // (5 + 6 + 7) * (1 + 2 + 3) = 24

变量closure指的是bar调用返回的内部函数foo。调用closure就像重新进入 范围内的范围foo,它可以看到所有foo的局部变量和参数。

即使在父函数终止之后

这意味着在foo执行之后,存储在closure变量中的返回函数保持foo. 你甚至可以通过foo再次调用来创建多个独立的闭包:

var closure = foo(1, 2);
closure(5, 6, 7); // (5 + 6 + 7) * (1 + 2 + 3) = 24

var closure2 = foo(0, 0);
closure2(5, 6, 7); // (5 + 6 + 7) * (0 + 0 + 3) = 21

/* closure2 does not affect the other closure */
closure(5, 6, 7); // (5 + 6 + 7) * (1 + 2 + 3) = 24
于 2013-03-27T19:07:29.340 回答
3

您对外部变量的解释不正确。这真的意味着它可以做到这一点:

function make_closure() {
  var x = 20;
  return function() {
    console.log(x);
  };
}

var closure = make_closure();
closure(); // Displays 20

于 2013-03-27T18:57:57.207 回答
3

我不确定你从哪里引用,但听起来它是在父函数完成运行时引用的。

于 2013-03-27T19:04:30.963 回答