Замыкания — это функции, ссылающиеся на независимые (свободные) переменные. Другими словами, функция, определённая в замыкании, «запоминает» окружение, в котором она была создана.источник
var counter = (function () {
var current = 0;
return function () {
current++;
return current;
}
})();
console.log(counter()); // 1
console.log(counter()); // 2
var current = 0;
var counter = function () {
current++;
return current;
}
console.log(counter()); // 1
current = 5;
console.log(counter()); // 6
замыкание js - это функция внутри другой функции ("обертки")
Closures
This was fun! CodeSchool did a great job in Javascript Road Trip Part 3, but it just didn’t click for my son right away. Closures still trip me up to this day.
My first explanation attempt:
“A closure is like a dinosaur fossil — a snapshot from a moment in time preserved for millions of years. You can get still get information about the dinosaur from the fossil, even though the dinosaur itself has been gone for millions of years.”
Closures were starting to make sense, so I tried using cookies again . . .
“Let’s say I go to the same bakery every day and ask the baker for a cookie. The first thing he/she asks is, ‘What kind of cookie do you want?’ After a few days, the baker might already know what cookie I like and simply ask, ‘The usual?’. By saving my cookie choice in memory, he/she is able to reuse the same function from the previous day to get me the proper cookie without having to ask again.”
Eh… It was still a bit fuzzy, until my son asked me…
“So, it’s like when we go to the barber and he just cuts our hair without asking what we want? He always asks new customers how they want him to cut, but never asks us anymore.”
Ding, ding, ding! He got it!!!
// Текущая область видимости - window
var a = 'window';
function something() {
// Текущая область видимости inner1
var b = 'inner1';
return function() {
// Область inner2
return b; // Это замыкание
// b нет в inner2, берется b из inner1
}
var closure = something(); // Функция с замнкнутой переменной называется тоже замыканием
closure() // => inner1, область осталась той же
var a="a"
var f1 = function () {
var b = "b";
var f1_1 = function() {
var c = "c";
// у дочерней функции f1_1 есть доступ к переменной a из глобальной области видимости
// к переменной b из области видимости функции f1
// к переменной c из локальной области видимости функции f1_1
console.log(a); // выведет a
console.log(b); // выведет b
console.log(c); // выведет c
}
// у функции f1 есть доступ к переменной a из глобальной области видимости
// к переменной b из области видимости функции f1
// переменная c, определенная в локальной области видимости функции f1_1, не видна
console.log(a); // выведет a
console.log(b); // выведет b
console.log(c); // выведет undefined
}
// в глобальной области видимости видна только переменная a
// и функция f1, которая также находится в глобальной области видимости
console.log(a); // выведет a
console.log(b); // выведет undefined
console.log(c); // выведет undefined