Как понять закрытие в Javascript?

Как можно понять замыкания в Javascript?

В общем случае замыкание является функцией, связанной с одной или несколькими внешними переменными. Когда он вызывается, функция может обращаться к этим переменным. В JavaScript закрытие часто реализуется, когда функции объявляются внутри другой функции. Внутренняя функция обращается к переменным родительского, даже после того, как родительская функция завершила

В этом утверждении "замыкание - это функция, связанная с одной или несколькими внешними переменными", означает ли это, что мы можем это сделать: var myFun = Function(msg){...}; Правильно ли это?

Что означает "даже после завершения родительской функции"?

Ответ 1

замыкание - это функция, связанная с одной или несколькими внешними переменными

Примером этого понятия является то, что функциональная панель привязана к внешним переменным 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

Ответ 2

Ваша интерпретация внешних переменных неверна. Это действительно означает, что он может сделать это:

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

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

Ответ 3

Я не уверен, откуда вы цитируетесь, но похоже, что он ссылается на завершение работы родительской функции.