Мой вопрос точно так же, как это один Javascript revealing module pattern, public propertiesJavascript показательны шаблон модуля и переменные
В этом потоке, ответ был дан, но не «почему». . Вот тот же вопрос пересчитаны с моим собственным примером:
myApp.User = function() {
var firstName = 'Default',
lastName = 'Default';
function setFirstName(name) {
firstName = name;
}
function setLastName(name) {
lastName = name;
}
function getFirstName() {
return firstName;
}
function getLastName() {
return lastName;
}
return {
getLastName: getLastName,
**getFirstName: getFirstName**,
setLastName: setLastName,
setFirstName: firstName
};
};
В этом случае пользователь() getFirstName всегда Evals «По умолчанию» - даже если я изменить его на другое значение с помощью функции setFirstName.
Если я заменить setFirstName как:
return {
getLastName: getLastName,
**getFirstName: getFirstName**,
setLastName: setLastName,
setFirstName: firstName
};
Я могу получить доступ к измененному значению. Я понимаю, что var firstName передается по значению, поэтому обновленные значения не отражаются. Я не понимаю, что особенного в этой функции. Где указатель на значение внутри функции? Почему все функции «магически» получают доступ к обновлению (-ам)?
Если он «всегда Evals на„по умолчанию“», то вы не называя 'setFirstName' первым на * тот же объект *. Кроме того, '{setFirstName: firstName}' подразумевает, что 'obj.setFirstName' * не является * функцией (поскольку' firstName' * не является * функцией), поэтому вы не можете называть его, даже если хотите. (И поскольку код * не меняет * переменную firstName .. конечно, он всегда будет «Default».) – user2864740
Возможный дубликат [Как работают блокировки JavaScript?] (Http://stackoverflow.com/questions/111102/how-do-javascript-closures-work) – Philipp
Должно ли последнее свойство возвращаемого объекта быть 'setFirstName: setFirstName', а не' setFirstName: firstname'? –