分配给不更新的全局对象的属性的变量

时间:2014-06-07 02:39:19

标签: javascript reference

我遇到了一个问题,即分配给全局对象属性的变量没有得到更新。我知道这是一种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

2 个答案:

答案 0 :(得分:1)

使用此行将newState设置为{new:'new'}var newState = state.set_primary({"new":"new"});

请注意,newState不包含对statestate.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中分配的对象。此时,newStatethis.current_form.primary都引用同一个对象。您可以像这样确认

console.log(newState === state.current_form.primary);

但是,下次当您致电schedule时,它会为current_form.primary分配一个新对象。因此,current_form.primarynewState现在指向不同的对象。这就是newState仍显示{new: "new"}的原因。