2012-11-21 19 views
5

Ich versuche, den Wert einer Variablen in einem Verschluss zu ändern:global ändern Variable in JavaScript Schließung

var myVariable; 
$.ajax({ 
    //stuff.... 
    success:function(data) { 
     myVariable = data; 
    } 
}); 

Das funktioniert nicht, weil myVariable die Schließung nicht sichtbar ist. Wie ändere ich diesen Code, so dass sich der Wert myVariable ändert?

+1

Das stimmt nicht. Wenn es global ist, ist es per Definition in allen Bereichen verfügbar. Wenn es eine lokale Variable namens 'myVariable' gibt, wird sie natürlich anstelle der globalen Version geändert. Wenn es wirklich global ist, können Sie 'window.myVariable' verwenden, um darauf zuzugreifen. – mowwwalker

+1

Ihr Beispiel zeigt nicht, warum es im Rahmen des Erfolgsrückrufs nicht sichtbar wäre. Die einzige Sache, die es verbergen würde, wäre, dass es eine Variable mit dem gleichen Namen in einem engeren Bereich gibt, der sie schattiert. –

+0

Hmm, ich denke, die Variable wird nicht geändert, weil Ajax kein Syncronhaus ist. Nicht sicher, wie man es jedoch syncrhronous machen kann – user1811367

Antwort

11

Im Gegensatz zu Ihrem Glauben, Ihr Code funktioniert. Aber zu sehen, was Sie versuchen, zwischen den Zeilen zu tun und zu lesen Ich vermute, Sie versuchen, dies zu tun:

var myVariable; 
$.ajax({ 
    //stuff.... 
    success:function(data) { 
     myVariable = data; 
    } 
}); 
alert(myVariable); // at this point myVariable is undefined!! 

Wenn ja, müssen Sie über asynchrone Funktionen lernen.

Grundsätzlich gibt die $.ajax() Funktion zurück, bevor die Ajax-Anforderung tatsächlich übermittelt wird. Es wird später die Ajax-Anfrage machen, wenn der Browser nicht gerade Javascript ausführt. Dies bedeutet, dass die Zuweisung noch nicht erfolgt ist, wenn Sie versuchen, den Wert myVariable zu melden.

Lesen Sie meine Antwort hier für mehr Details: JS global variable not being set on first iteration

Die einzige gute Lösung ist es, die Art und Weise Sie Codierung denken zu ändern. (Es gibt eine wohl schlimme Lösung, die darin besteht, den Ajax-Aufruf auf synchron zu stellen, aber wir kommen nicht dazu, Sie können es googlen, wenn Sie das Handbuch lesen oder lesen wollen). Statt dies zu tun:

var myVariable; 
$.ajax({ 
    //stuff.... 
    success:function(data) { 
     myVariable = data; 
    } 
}); 
/* 
* Do lots of stuff with the returned value 
* of the myVariable variable 
* 
*/ 

Sie brauchen jetzt es so schreiben:

var myVariable; 
$.ajax({ 
    //stuff.... 
    success:function(data) { 
     myVariable = data; 
     /* 
     * Do lots of stuff with the returned value 
     * of the myVariable variable 
     * 
     */ 
    } 
}); 

Grundsätzlich kann jede und alle Codes bewegen, die Sie nach dem Ajax-Aufruf in den Erfolg Rückruf geschrieben hätten. Das ist gewöhnungsbedürftig (ausgehend davon, wie viele Varianten dieser Frage im Internet existieren). Aber wenn man einmal daran gewöhnt ist, wird es zur zweiten Natur.

Es gibt einen Namen für diese Art der Programmierung. Es ist verschiedentlich bekannt als: "ereignisgesteuerte Programmierung" oder "Fortsetzung-Weitergabe Stil" oder "evented Programmierung". Sie können die verschiedenen Begriffe googlen, wenn Sie mehr wissen möchten.

+0

Dies wird wahrscheinlich das Herz des Problems, obwohl es schwer ist, die Erklärung zu erklären. – tjameson

+0

@tjameson: Wenn jemand versucht, das Ergebnis eines Callbacks einer eingeschlossenen Variablen zuzuordnen, ist es wahrscheinlich das Problem. Beantworte lange genug Fragen zu SO und du siehst Muster zu den Fragen. – slebetman

3

Wenn dieser Code im globalen Gültigkeitsbereich ist, ist myVariable sichtbar für die innere Funktion. Wenn Sie sich Sorgen machen über sie von einer lokalen Variablen beschattet wurden, explizit Zugriff als Eigenschaft der global:

var myVariable; 
$.ajax({ 
    //stuff.... 
    success:function(data) { 
     window.myVariable = data; 
    } 
}); 
Verwandte Themen