【发布时间】:2014-02-05 22:51:26
【问题描述】:
我的问题和这个Javascript revealing module pattern, public properties一模一样
在那个帖子中,给出了答案,但没有给出“为什么”。这是用我自己的示例重申的相同问题:
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
};
};
在这种情况下,User().getFirstName 总是评估为“默认”——即使我通过 setFirstName 函数将其更改为其他值。
如果我用 setFirstName 替换:
return {
getLastName: getLastName,
**getFirstName: getFirstName**,
setLastName: setLastName,
setFirstName: firstName
};
我能够访问更改后的值。我知道 var firstName 是按值传递的,这就是不反映更新值的原因。我不明白该功能有什么特别之处。指向函数中值的指针在哪里?为什么所有功能都“神奇”地访问更新?
【问题讨论】:
-
如果它“总是评估为'默认'”,那么您不会首先在同一个对象上调用
setFirstName。此外,{ setFirstName: firstName }暗示obj.setFirstName不是 一个函数(因为firstName不是 一个函数),所以你不能调用它,甚至如果你愿意。 (而且由于代码没有改变 firstName 变量.. 当然它总是'默认'。) -
返回对象的最后一个属性不应该是
setFirstName: setFirstName而不是setFirstName: firstname吗? -
@user1066946 同意。我刚刚完成了该链接的阅读,您是对的-这是对闭包问题的一种变体。阅读后,我现在明白它为什么起作用了
标签: javascript