Есть разница.Замыкание наблюдается, когда внутренняя функция возвращается за пределы своей лексической области, но все еще поддерживает связь с ее лексической средой.Взгляните на пример ниже.
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
собирают мусор.
Короче говоря, с замыканиями внутреннее состояние контекста выполнения внешней функции получаетсохраняется, но с вложенными функциями, контекст выполнения внешней функции исчезает, а созданные переменные и функции получают мусор.