Причина, по которой вам нужно создать внутреннюю функцию с переменными в области видимости, заключается в объектно-ориентированной инкапсуляции. Это по сути частные переменные.
Переменные «закрыты».
// constructor function
var myObject = function(message) {
// private - scope is function level. It's CLOSED OVER the the inner function (closure).
// not delcared as a JSON property so not visible externally
var value = 0;
// constructor returns JSON object with public methods
// always constructed from the myObject var so it always hands back the same instance
// of the public methods
return {
// nested functions have access to outer function variables.
increment: function (inc) {
value ++;
},
getValue: function() {
return value;
},
// the inner function even has access to the outer function's args!
getMessage: message
}
};
Посмотрите на инструкцию возврата. Он возвращает открытый интерфейс - некоторые методы имеют доступ к закрытой переменной, потому что они находятся во внутренней функции. Для создания объектно-ориентированной инкапсуляции он использует переменную области действия JavaScripts.
После этого я могу это как:
var obj = myObject('Hello World');
obj.increment();
obj.increment();
console.log(obj.getValue());
console.log(obj.getMessage);
// should be undefined
console.log(obj.value);
Обратите внимание, что в этот момент потребитель не имеет доступа к защищенному / инкапсулированному значению или сообщению.
Теперь вот кикер - объект изменчив, поэтому вызывающая сторона может добавлять методы или даже заменять методы. Итак, вы могли бы подумать, что кто-то может добавить метод, который разоблачает внутренности. Но они не могут из-за области действия функции (закрытие - они закрыты). Только вложенная функция имеет доступ к переменным внешней функции. Таким образом, если вызывающий добавляет метод для возврата внутреннего, он не может получить доступ, и он будет неопределенным.
Код выше выводит:
2
Hello World
undefined
В качестве примечания я запускаю JavaScript с node.js
Вот хороший пост в блоге по шаблону модуля с использованием замыканий:
http://www.yuiblog.com/blog/2007/06/12/module-pattern/