我遇到了一个问题,即分配给全局对象属性的变量没有得到更新。我知道这是一种javascript传递参考问题我不理解,尽管已经查看了一些其他类似的SO问题。这是我为测试这个场景而编写的一些代码:
function formState (type) {
this.current_form = { primary:null};
this.set_primary = function(form) {
this.current_form.primary = form;
return this.current_form.primary;
};
}
var schedule = function(someState) {
someState.set_primary({"updated":"updated"});
};
var state = new formState();
var newState = state.set_primary({"new":"new"});
console.log("newState = ", newState);
schedule(state);
console.log("newState = ", newState);
结尾处的console.log
显示newState = { new: 'new' }
。为什么是这样?如果newState
引用了一块内存,我是否应该能够从任何地方更新该内存并将更改反映在newState
中?我在这里遗漏了一些基本的东西,任何帮助都会受到赞赏。
这里是相应的repl。
答案 0 :(得分:1)
使用此行将newState设置为{new:'new'}
:
var newState = state.set_primary({"new":"new"});
请注意,newState不包含对state
或state.current_form
所以当你运行这一行时:
schedule(state);
它更改state.current_form.primary,但它对分配给newState的{ new: 'new' }
对象没有影响。
如果您想看到更改,可以执行此操作:
var state = new formState();
var newState = state.current_form;
state.set_primary({"new":"new"});
console.log("newState = ", newState.primary);
schedule(state);
console.log("newState = ", newState.primary);
这将打印:
newState = { new: 'new' }
newState = { updated: 'updated' }
注意区别。在此版本的代码中,newState设置为current_form对象,该对象不会被set_primary调用替换。现在,当state.current_form.primary
设置为引用对象{updated:'updated'}
时,newState.primary
指向更新的对象。
答案 1 :(得分:0)
首先,this.current_form.primary
引用对象{"new":"new"}
,并返回在newState
中分配的对象。此时,newState
和this.current_form.primary
都引用同一个对象。您可以像这样确认
console.log(newState === state.current_form.primary);
但是,下次当您致电schedule
时,它会为current_form.primary
分配一个新对象。因此,current_form.primary
和newState
现在指向不同的对象。这就是newState
仍显示{new: "new"}
的原因。