我的問題是完全一樣的,因爲這一個Javascript revealing module pattern, public properties揭示的Javascript模塊模式和變量
在該線程,答案給出,但不是「爲什麼」。 。這是同樣的問題,用我自己的例子重申:
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是通過值傳遞的,這就是爲什麼更新後的值沒有被反映出來。我不明白這個功能有什麼特別之處。指向函數中值的指針在哪裏?爲什麼所有功能「奇蹟般地」獲得更新(s)?
如果「總是evals到‘默認’」那麼你就不會調用'setFirstName'第一的*同一個對象上*。此外,'{setFirstName:firstName}'意味着'obj.setFirstName' *不是一個函數(因爲'firstName' *不是函數),所以即使你想要,也不能調用它。 (並且由於代碼*不會改變* firstName變量..當然,它將始終是'默認'。) – user2864740
可能重複[JavaScript封閉如何工作?](http://stackoverflow.com/questions/111102/how-do-javascript-closures-work) – Philipp
不應該將返回對象的最後一個屬性設置爲'setFirstName:setFirstName'而不是'setFirstName:firstname'? –