Вложенная функция и замыкания - PullRequest
0 голосов
/ 09 мая 2018

В чем разница между вложенными функциями и замыканиями в JavaScript или одинаковыми? Есть какая-то функциональная разница?

1 Ответ

0 голосов
/ 09 мая 2018

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

function addOne() {
  var x = 1;
   function bar() {
    console.log(++x);
  }
	return bar;
}

var adder = addOne();
adder(); // 2
adder(); // 3
adder(); // 4

Из приведенного выше видно, что вызывается addOne() и возвращается функция bar, которая сохраняется в сумматоре.Как правило, вы ожидаете, что внутреннее состояние вызова addOne () (переменная среда контекста выполнения) будет собирать мусор, но, поскольку существует внешняя ссылка на функцию bar, внутреннее состояние вызова addOne()сохранились.Когда вызывается сумматор, он обновляет переменную x из-за закрытия.

function addOne() {
  var x = 1;
   function bar() {
    console.log(++x);
  }
  bar();
}

var adder = addOne(); // 2
adder() // Uncaught TypeError: adder is not a function

С помощью приведенного выше кода функция bar просто вложена в функцию addOne.Когда вызывается функция addOne, создается контекст выполнения, который создает var x и функцию bar.когда вызывается bar, он может обновить значение x из-за лексической области видимости.Когда функция addOne завершается, контекст выполнения исчезает, а x и bar собирают мусор.

Короче говоря, с замыканиями внутреннее состояние контекста выполнения внешней функции получаетсохраняется, но с вложенными функциями, контекст выполнения внешней функции исчезает, а созданные переменные и функции получают мусор.

...