1

根底にある問題がありますので、助けていただければ幸いです。

  • 私のsciptのトップ私はグローバルな価値を宣言します(' _raw')
  • (jQueryを使用)JSON配列データを返すAjax呼び出しを行います(確認しましたが、JSONデータは正しいです)
  • このJSON応答を受け取り、に割り当てます_raw
  • リンクをクリックすると、_raw関数に渡されます。function myFunction(dataArray)myFunction(_raw)
  • この関数内で、いくつかの基準に基づいて、dataArrayスプライスされます(つまりdataArray.splice(2,1)
  • dataArrayその後、返されます。

例えば

var _raw;

// AJAX call sets RAW to an array e.g. Apple, Banana, Pear, Pineapple, Coconut, Raspberry

myFunction(dataArray){
  var data=dataArray;
  data.splice(2, 1);
  return data[0];
}


$('a').click(function(){

  result = myFunction(_raw);
  alert(result);
// First time this is run, returns 'Pear', however, second time, returns 'Coconut'- as if the splice is being performed on _raw as well as myArray/data...

});
  • 上記のコードが貧弱であることに感謝します。これは問題を説明するためのものです。

私が抱えている問題は、私が見る限り、唯一の時間_rawが設定されているのはAJAX呼び出し中ですが、関数myFunctionが呼び出されて渡されると_raw、スプライスも_rawそれ自体に影響を与えるようです。なぜこうなった?

4

3 に答える 3

2

JavaScript では、配列は常に参照によって渡されるため、配列をデータ変数に割り当てると、_raw へのポインターを作成するだけで、すべての操作は _raw で行われます。

アレイのクローンを作成する必要があります。その内容と多次元かどうかによっては、こちらのようにディープ コピーを行うメソッドを使用する必要がある場合があります

于 2012-04-04T11:05:21.040 に答える
2

splice()元の配列を変更します: http://www.devcurry.com/2010/12/slice-and-splice-in-javascript.htmlを参照してください

slice() とは異なり、splice() メソッドは元の配列を変更し、新しい配列を返します。

補足として、これはグローバル変数であり、どこにでも表示されるため、_raw引数として渡す必要はありません。myFunction()

于 2012-04-04T11:02:39.873 に答える
2

配列は参照によって渡されるため、配列はコピー されvar data = dataArrayません。
したがって、元の配列を変更します。data.splice(2,1)

.slice(2,1)配列をコピー するために使用します。または、2 番目の要素の値を取得
したいように見えるので、数値インデックスを使用します。

function myFunction(dataArray){
    return dataArray[2];
}
于 2012-04-04T11:01:35.993 に答える