-1

サーバーに投稿するデータのクライアント側のコレクションを構築しています。[追加]ボタンの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

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

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

4

1 に答える 1

1

オブジェクトを渡し、コピーを期待しているように聞こえます。

JavaScriptでは、オブジェクト自体が割り当てにコピーされることはありません。これは値による言語ですが、オブジェクトの場合、コピーされる値はオブジェクトへの参照です。したがってnewData、fromgetDataFromFormに戻ると、それぞれの同じオブジェクトへの参照のコピーが作成されますonClick

于 2012-04-17T01:26:28.007 に答える