2012-04-04 10 views
1

Ich habe ein Problem, das ich nicht auf den Grund zu bekommen, so würde jede Hilfe sehr geschätzt werden.Javascript Global Variable Scope/Überschreiben auf Splice

  • A die Spitze meiner scipt ich einen globalen Wert zu deklarieren ('_raw')
  • (mit jQuery) ich einen Ajax-Aufruf zu machen, die JSON-Array-Daten zurückgibt (Ich habe geprüft, die JSON-Daten richtig)
  • ich diese JSON Antwort nehmen und weisen es _raw
  • Wenn ich auf einen Link klicken, wird _raw an eine Funktion übergeben, zB function myFunction(dataArray), genannt mit myFunction(_raw)
  • Innerhalb dieser Funktion, basierend auf einigen Kriterien dataArray gespleißt wird (das heißt dataArray.splice(2,1))
  • dataArray wird dann.

z.B.

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... 

}); 
  • Ich schätze es einige schlechte Code oben ist, ist dies das Problem zu veranschaulichen

Das Problem, das ich habe, ist, dass, soweit ich sehen kann, ist die einzige Zeit _raw ist set, ist während des AJAX-Aufrufs jedoch, wenn die Funktion myFunction aufgerufen wird, die _raw übergibt, scheint der Spleiß auch _raw selbst zu wirken. Warum passiert dies?

+0

Arrays werden als Referenz in Javascript übergeben, so Arrays sind Zeiger, wie Objekte, Funktionen, ect ... Sie können array.slice jedoch ein neues Array zurückgeben. – mpm

Antwort

2

In JavaScript sind Arrays immer als Referenz übergeben, so dass, wenn Sie Weisen Sie es der Datenvariablen zu, Sie erstellen nur einen Zeiger auf _raw und alle Operationen werden auf _raw ausgeführt.

Sie müssen einen Klon des Arrays erstellen. Je nachdem, was darin enthalten ist und ob es multidimensional ist, müssen Sie möglicherweise eine Methode verwenden, die eine tiefe Kopie gemäß here durchführt.

2

Arrays werden durch Referenz übergeben, so var data = dataArray tut nicht das Array zu kopieren.
So, data.splice(2,1)ändert das ursprüngliche Array.

Verwenden Sie .slice(2,1), um das Array zu kopieren.
Oder, da es, dass Sie Sekunden Elements Wert, verwenden Sie die numerischen Indizes erhalten möchten scheint:

function myFunction(dataArray){ 
    return dataArray[2]; 
} 
2

splice() ändert das ursprüngliche Array: http://www.devcurry.com/2010/12/slice-and-splice-in-javascript.html

Im Gegensatz zu slice() sehen, die Die splice() -Methode ändert das ursprüngliche Array und gibt ein neues Array zurück.

Als Nebenbei bemerkt, brauchen Sie nicht wirklich _raw als Argument von myFunction() passieren, da es sich um eine globale Variable ist und somit ist überall sichtbar