2016-08-11 3 views
-2

曖昧なタイトルは申し訳ありませんが、配置方法は不明です。jQuery、関数を介してグローバルオブジェクトを操作する(予期しない結果?)

したがって、関数をトリガーするclickイベントでデータとして渡すオブジェクト(配列(X)を含む)があるとします。この関数は、渡されたオブジェクトの配列を参照する新しい変数(Y)を作成します。その配列変数(Y)に新しい値をプッシュすると、新しく作成された配列(Y)だけでなく元の配列(X)も操作されます。 奇妙な説明は、最も簡単だと思うと思う。this fiddle私は全部を紹介するために作った。

私の質問は、オブジェクトの元の配列を操作するのはなぜですか? (コードを見ると、私がe.data.testdata.testarrayに直接プッシュした場合、それが操作されたかどうかはわかりますが、新しく作成された参照変数(Y)にプッシュすると、なぜそうなりますか)。

Testcode:私はあなたが私が間違っている場合は、この答えを考慮していない、この

$(function() { 
    var testObj = { 
     testarray: ['test1', 'test2'] 
    }; 
    $('.js-test').on('click',function (e) { 
     newValue = 'test'+(testObj.testarray.length+1); 
     testObj.testarray.push(newValue); // you can access testObj here because scope of sub block. 
     alert(testObj.testarray); 
    }); 
}); 

// alert(testObj.testarray); you can not access here because it out of scope 

は実際に私が正しくあなたの質問を取得していない必要があります願っています

$(function() { 
function testManipulate (e) { 
    alert(e.data.testdata.testarray); 
    var scopedTestArray = e.data.testdata.testarray, 
      newValue = 'test3'; 

    scopedTestArray.push(newValue); 
    alert(e.data.testdata.testarray); 
} 

var testObj = { 
    testarray: ['test1', 'test2'] 
}; 

$('.js-test').on('click', {testdata: testObj}, testManipulate); 
}); 
+2

両方の変数は、配列がメモリに格納されている場所への*参照*です。したがって、それらはコピー時に同じものを指します。配列クローニングを検索します。これをカバーする答えがたくさんあります。 –

+0

あなたの質問の完全な内容はリンクされているだけでなく、**あなたの質問に**ある必要があります。リンクが腐って、将来の質問やその回答が役に立たなくなり、人々はあなたを助けるためにオフサイトに行く必要はありません。スタックスニペット( '<>'ツールバーボタン)を使用して理想的に[mcve] **を実行可能にします。その他:[*どのように良い質問をするのですか?](/ help/how-to-ask) –

+0

Thanks @ RoryMcCrossanは正しいと思います。 そして、ええ、いい方法で質問を策定する方法を知りませんでした...それを残念に誰かがそれをより良いものに変えたいならば、喜んでより良いタイトルを取るでしょう。 – Selo

答えて

0

+0

これは更新されたコードhttps://jsfiddle.net/mj386ntb/1/のjsfiddleリンクです –

関連する問題