2012-04-16 4 views
-1

私は、サーバーに投稿するためのクライアント側のデータコレクションを構築しています。 AddボタンのonClickイベントを使用して、私はフォームデータを収集し、それを内部配列に格納しています。これは問題のデモを試みるための偽のサンプルコードです(残念ながらソースを共有できません)。オブジェクトリファレンス変数宣言を超えて永続化

var getDataFromForm = (function() { 
    var _internal = {}; /* Based on feedback, I think this is the reason for the behavior I'm experiencing */ 
    return function() { 
     var form = {}; 
     /* Get the form data */ 
     _internal.name = form.name; 
     _internal.id = form.id; 
     return _internal; 
    }; 
}()); 

var internal = { vals: [] }; 

function onClick() { 
    var newData = getDataFromForm(); 

    doAjaxValidation({ 
     success: function() { 
      internal.vals.push(newData); /* All values in array have been updated to this newData reference on click */ 
      internal.vals.push(JSON.parse(JSON.stringify(newData))); /* ugly, but the reference is broken and future clicks work as expected */ 
      internal.vals.push($.extend({}, newData)); /* reference to the object is still persisted through jQuery's extend */ 
     } 
    }); 

} 

は私がnewData参照がnewData各ボタンのクリックの新しい割り当てに手渡される理由として困惑しています。各クリックイベントは新しい関数呼び出しであり、newData(理論上は)は、他のボタンクリックからのnewDataに関連しない新しいオブジェクトである必要があります。

私には何が欠けていますか?

編集:このサンプルははるかに大きなコードブロックからのものであり、可能な限り単純な表現に縮小しようとしました。明らかに、そのままでは、これは機能的なコードではありません。

+1

私は問題がgetDataFromFormにあると推測しています...そのコードを共有できますか? – Prestaul

+1

* "私は何が欠けていますか?" *確かに分かりませんが、私たちが欠けているのは、割り当て対象のオブジェクトを明らかに返すコードです。実際、オブジェクト自体は決して割り当てにコピーされません。コピーされる値は、オブジェクトへの参照です。 –

+0

あなたはなぜあなた自身の質問を放棄しましたか? –

答えて

1

オブジェクトを渡しているように見え、コピーが必要です。

JavaScriptでは、オブジェクト自体は割り当てにコピーされません。値がのですが、オブジェクトの場合、コピーされる値はオブジェクトへの参照になります。したがってnewDatagetDataFromFormから返すと、onClickの同じオブジェクトへの参照がコピーされます。

+0

素晴らしい! JavaScriptの変数宣言/代入に関する文書へのリンクはありますか? – Christopher

+0

@Christopher:申し訳ありませんが、私はそれを扱っているドキュメントはありません。一般的な情報については、https://developer.mozilla.org/ja/JavaScript/Guideを参照してください。 Mozillaに固有の機能が含まれていますが、一般的にはMozillaに対応していると思います。 –

+1

問題ありません。私たちは、JavaScriptのバリュー関連のバグを参考にして取り組んできました。 http://objrefnotset.blogspot.com/2012/02/javascript-object-and-variable-scope.html私はあなたの洞察力の明確さに感謝します。 – Christopher