/* (box) — объект, внутренние значения которого могут быть
считаны и обновлены: */
/* Функции, отслеживающие
переменные в содержащих эти переменные областях ви-
димости, и называются замыканиями (closures) */
/**/
function sandwichMaker(magicIngredient) {
return function(filling) {
return magicIngredient + " and " + filling;
};
}
/**/
function box() {
var val = undefined;
return {
set: function(newVal) { val = newVal; },
get: function() { return val; },
type: function() { return typeof val; }
};
}
var b = box();
b.type(); // "undefined"
b.set(98.6);
b.get(); // 98.6
b.type(); // "number"
/* В этом примере создается объект, в котором содержатся
три замыкания — это его свойства set (установить), get
(получить) и type (определить тип). Каждое из этих замы-
каний имеет доступ к общей переменной val. Замыкание
set обновляет значение переменной val, а последующие
вызовы get и type позволяют увидеть результат обнов-
ления. */
/*
Чтобы понять суть замыканий, от вас требуется знать три основных факта.
ВКРАЦИИ
Функции могут ссылаться на переменные, определенные во внешней области видимости.
Замыкания могут пережить создавшую их функцию.
Замыкания хранят внутри себя ссылки на свои внешние переменные, они
способны как читать, так и обновлять эти свои переменные.
ПОДРОБНЕЕ
Первый заключается в том, что JavaScript позволя-
ет ссылаться на переменные, определенные за пределами
текущей функции:
Второй факт заключается в том, что функции могут
ссылаться на переменные, определенные во внешних
функциях, даже после выхода из этих внешних функций!
Это означает, что вы можете возвращать
внутреннюю функцию для ее последующего вызова:
Третий и последний касающийся замыканий факт, о ко-
тором нужно знать, заключается в том, что они могут
обновлять значения внешних переменных. На самом деле
в замыканиях хранятся ссылки на их внешние перемен-
ные, а не копии этих переменных. Поэтому обновленные
переменные становятся видимыми для любых замыка-
ний, которые имеют к ним доступ.
*/