2 Stimmen

Unregelmäßigkeiten im Wert der übergeordneten JavaScript-Variablen?

Ich habe den folgenden Code:

var address;
getAddress(0,0);
function getAddress(latlng) 
{
  if (latlng != null) 
  {
    geocoder.getLocations(latlng, 
    function(addresses) 
    {
      if(addresses.Status.code == 200) 
      { 
        address = addresses.Placemark[0].address.toString();
        alert(address);  // Outputs something :)
      }
    });
   }
   return address;   //returns nothing :(
}

address gibt immer zurück undefined aber die Meldung gibt etwas aus. Woran liegt das?

(Geocoder ist eine Instanz von Google Maps-APIs )

0 Stimmen

Diese Frage scheint entweder viel zu einfach oder viel zu schwer zu beantworten zu sein :(

0 Stimmen

Wie ist geocoder.getLocations definiert? Ohne das zu wissen, ist es sehr schwer zu sagen, welche Änderungen Sie vornehmen müssen.

0 Stimmen

Und sollte getAddress(0,0) nicht nur einen Parameter haben? getAddress([0,0])?

3voto

Noah Goodrich Punkte 24212

Ich denke, dass Ihre Probleme alle mit dem Anwendungsbereich zusammenhängen. Im Allgemeinen sollten Sie sich nicht auf eine globale Deklaration einer Variablen verlassen, die innerhalb des Bereichs einer Funktion verwendet werden soll.

Dies sollte alle Probleme mit dem Umfang Ihrer Funktion beheben:

var address = getAddress(0,0);

function getAddress(latlng) {
    if (latlng != null) {
        var address = geocoder.getLocations(latlng, function(addresses) {
            if(addresses.Status.code == 200) { 
                return addresses.Placemark[0].address.toString();
            }
        });
    }
return address;
}

0voto

Victor Punkte 9160

Wenn ich mich nicht irre, sieht es so aus

geocoder.getLocations

gibt keinen Wert zurück, sondern erwartet in Ihrem Fall eine Callback-Funktion:

function(addresses) {
    if(addresses.Status.code == 200) { 
        return addresses.Placemark[0].address.toString();
    }
}

Dieser "innere" Rücksprung wird nicht viel bringen, da er zu den Innenseiten von geocoder.getLocations zurückkehrt.

Die Funktion, die die Zuweisung vornimmt, wird also wahrscheinlich später aufgerufen als die äußere Rückgabe (der Callback und der Status 200 deuten darauf hin, dass es sich um einen langsamen http-Aufruf handelt).

Das heißt, wenn Sie geocoder.getLocations nicht ändern können, wird die Lösung darin bestehen, Ihre Funktion ebenfalls funktional zu machen, etwa so:

function getAddress(latlng, callback) {
    if (latlng != null) {
        geocoder.getLocations(latlng, function(addresses){
            if(addresses.Status.code == 200) { 
                address = addresses.Placemark[0].address.toString();
                alert(address);
                //Outputs something :)
                callback(address);
            }
        });
    }

}

und Sie werden es mit etwas wie aufrufen:

getAddress(ll, function(address){
   alert(address);
});

Und als Bonus können Sie die globale Variable loswerden :-)

0 Stimmen

Es gibt eine Menge Lesestoff über funktionales Javascript: google.com/search?q=funktional+javascript

0voto

Chei Punkte 2027

Ich habe den Fehler erfolgreich reproduziert, indem ich geocoder.getLocations() so implementiert habe, dass es asynchron ist. Wenn geocoder.getLocations() einfach die Parameterfunktion ausführen würde, würde die Änderung der Variablen sichtbar werden, bevor getAddress() zurückkehrt, es handelt sich also nicht um ein Problem des Anwendungsbereichs.

var address;
alert("B: address returned: " + getAddress());
function getAddress() {
  executeFunction(function() {
    address = "myAddress";
    alert("C: address set to: " + address);
  });
  return address;
}

function executeFunction(aFunction) {
  alert("A: executing: " + aFunction);
  window.setTimeout(aFunction, 1);
}

Die Ausführung des obigen Codes führt zu der Alarmreihenfolge A-B-C, was bedeutet, dass die Adresse vor ihrer Zuweisung zurückgegeben wird. Ersetzen von window.setTimeout(aFunction, 1); con aFunction() Ergebnisse in der Reihenfolge A-C-B, wobei die letzte Meldung "B: Adresse zurückgegeben: myAddress" lautet.

-4voto

Static Tony Punkte 224

Ich kann keinen Grund erkennen, warum das nicht funktionieren sollte.

Um doppelt sicher zu sein, dass nichts zurückkommt, machen Sie den Funktionsaufruf wie folgt

window.alert(getAddress(0,0));

Und dann sehen Sie, was ausgegeben wird

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X