如何理解Javascript中的闭包?

use*_*234 16 javascript closures

如何理解Javascript中的闭包?

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

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

什么意思"甚至在父功能终止后"?

Ric*_*omi 7

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

这个概念的一个例子是函数栏绑定到外部变量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
Run Code Online (Sandbox Code Playgroud)

变量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
Run Code Online (Sandbox Code Playgroud)


Dar*_*con 3

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

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

var closure = make_closure();
closure(); // Displays 20
Run Code Online (Sandbox Code Playgroud)

  • 我认为重要的一点是为什么这是一个关闭。闭包是围绕“x”创建的,当您从“make_closure()”调用返回时,它通常会超出范围,但由于返回的函数引用了它,因此被迫保留下来。 (2认同)