如何理解Javascript中的闭包?

时间:2013-03-27 18:53:41

标签: javascript closures

如何理解Javascript中的闭包?

  

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

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

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

3 个答案:

答案 0 :(得分:7)

  

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

这个概念的一个例子是功能栏绑定到外部变量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

答案 1 :(得分:2)

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

function make_closure()
{
    var x = 20;
    return function()
    {
        alert(x);
    };
}

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

答案 2 :(得分:2)

我不确定你在哪里引用,但听起来它在父功能运行完毕时就引用了。