2017-07-09 31 views
0

我在我的代码中有一个模块,我无法更改对象的属性的值。我有代码更详细的解释,见下图:无法更改对象的属性值 - JavaScript

var network = (function(){ // Created a closure. 
    var ajax = { 
    response: 0, // I set the initial value of response to 0 
    parse: function(x){ 
      var y = JSON.parse(x); 
      ajax.response = y; // This is where things don't seem to work. Value of response is still 0. 
      } 
    // Some other code. 

    } // End of ajax object. 

    return { // I return an Object . 
    invoke: function(x){ ajax.parse(x); }, 
    reply: ajax.response 
    } 

})(); 

network.invoke(valid_argument); // I invoke the function and pass a valid json string received from a server via ajax. 
console.log(network.reply); // I get 0, which is the initial value. Why? 

由于在这个问题上感觉怪怪的代码中提到,任何帮助表示赞赏。

+0

函数中没有_response_可用。它位于ajax对象内 – brk

+0

ajax中的“a”代表*异步*? – adeneo

+0

@brk哎呀!这应该是答复,我现在纠正它。你可以看看现在吗? – Teja

回答

1

我得到0,这是初始值。为什么?

因为reply: ajax.response分配给reply(的拷贝),该ajax.response在线路执行此刻具有的值。未来更改为ajax.response不会影响reply,这两个属性之间没有内在联系。

这里是相同的情况下的简化示例:

var x = 42; 
var y = x; 
x = 21; 
console.log(y); // still 42 

JavaScript是pass-by-value,不pass-by-reference。这意味着将该值的副本分配给reply,而不是对ajax.response财产的引用。

+0

如果我使用函数来返回ajax.response的值,它会在运行时返回值吗?像这样:reply:function(){return ajax.response;} – Teja

+0

如果你的意思是'reply:function(){return ajax.response; }',那么是的,因为那么'ajax.response'在每次调用'reply'时被评估,不仅在构造对象时被评估一次。 –

0

@Teja:Felix King向您展示技术方面,这是真的。我想给我的代码质量2美分。 Javascript允许我们以非常灵活的方式进行编码,而且它确实看起来很混乱,Javascript代码很难阅读。所以你编写代码片段,看看复杂。避免过多使用功能。

@Felix King:我认为按价值传递或传递参考在这里是不相关的。这些概念适用于传递给函数而不是赋值操作的参数。