我想知道为什么会有如此奇怪的行为,因为variableOne应该是相同的。
myfun = (function() {
var variableOne = 10;
get = function(){
return variableOne;
}
set = function(value){
variableOne = value;
}
return {variableOne,set,get};
})();
// Console Window Output
console.log(myfun.variableOne);
>>10
myfun.variableOne = 90;
myfun.get()
>>10
为什么variableOne的值没有更改为90。
最佳答案
发生这种情况是因为 variableOne
是一个原始值 - 原始值是按值复制的,而不是按引用复制的,因此一旦在return
(顺便说一句,这是通过使用“对象文字属性值简写”创建属性,而不是解构赋值)完成,现在它们是两个单独的变量。附带说明 - 正如我所说,对象是通过引用复制的,但您仍然可以使用赋值运算符更改引用本身(您可以在此处的另一个 SO 问题中阅读有关此内容的更多信息: Is JavaScript a pass-by-reference or pass-by-value language? )。
更重要的是,get
方法访问返回对象之外的 variableOne
- 闭包中定义的对象(即使它仍然存在)关闭已经执行)。
set
方法实际上并不是属性 setter ,因为创建 setter
需要您传递属性名称。在本例中,这只是另一个常规对象方法。
关于javascript - 解释以下 JS 代码的行为(闭包),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45649358/