2017-07-09 25 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"は* asynchronous *を表しますか? – adeneo

+0

@brkそれは返事であるはずだった、私は今それを修正した。あなたは今見てみることができますか? – Teja

答えて

1

私は初期値である0を取得します。どうして?

reply: ajax.response

reply(のコピー)ajax.responseラインが実行される瞬間にを有すること値に割り当てるため。 ajax.responseへの今後の変更はreplyに影響しません。これらの2つのプロパティの間には本質的な接続はありません。ここで

は、同じような状況の簡単な例です:

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

JavaScriptがpass-by-value、ないpass-by-referenceです。つまり、値のコピーはに割り当てられ、ajax.responseプロパティへの参照には割り当てられません。

+0

ajax.responseの値を返すために関数を使用すると、実行時に問題が発生するので役立ちますか?このように:reply:function(){return ajax.response;} – Teja

+0

あなたが 'reply:function(){return ajax.response; } 'それで'はい。そうすれば 'ajax.response'は' reply'が呼び出されるたびに評価されます。 –

0

@Teja:フェリックスキングはあなたに技術的側面を示しており、それは本当です。私は2セントにコードの品質を与えたいと思っています。 Javascriptは非常に柔軟な方法でコード化することができますが、実際は混乱しています.Javascriptコードは読みにくいです。だからあなたは複雑な見通しをスニペットでコードしますか?あまりにも多くの機能を使用しないでください。

@Felix King:値渡しやパス渡しはここでは関係ありません。これらの概念は、パラメータが代入操作ではなく関数に渡された場合に適用されます。

関連する問題