2

次のコードがあります。

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常に戻りますundefinedが、アラートは何かを出力します。どうしてこれなの?

(Geocoder はGoogle Maps APIのインスタンスです)

4

4 に答える 4

3

あなたの問題はすべてスコープに関連していると思います。一般的に言えば、関数のスコープ内で使用される変数のグローバル宣言に依存したくはありません。

これにより、関数のスコープの問題が修正されます。

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;
}
于 2008-11-26T16:15:30.880 に答える
0

geocoder.getLocations() を非同期に実装することで、エラーを正常に再現しました。geocoder.getLocations() が単純にパラメーター関数を実行した場合、getAddress() が戻る前に変数の変更が表示されるため、これは範囲の問題ではありません。

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);
}

上記のコードを実行すると、アラート順序 ABC が発生します。これは、アドレスが割り当てられる前に返されることを意味します。window.setTimeout(aFunction, 1);ACB の順序で結果に置き換えaFunction()ます。最後のアラートは「B: 返されたアドレス: myAddress」です。

于 2008-11-26T17:09:30.287 に答える
0

見間違いでなければこんな感じ

geocoder.getLocations

あなたの場合、値を返しませんが、コールバック関数を期待します:

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

この「内部」リターンは、geocoder.getLocations の内部に返されるため、あまり効果がありません。

そのため、代入を行う関数は、おそらく外側の return よりも後で呼び出されています (コールバックと 200 ステータスは、遅い http 呼び出しが関係していることを示しています)。

つまり、 geocoder.getLocations を変更できない限り、解決策は関数も機能させることです。たとえば、次のようになります。

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);
            }
        });
    }

}

そして、あなたは次のようなものでそれを呼び出します:

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

おまけとして、グローバル変数を取り除くことができます:-)

于 2008-11-26T16:26:29.080 に答える
-4

これがうまくいかない理由がわかりません。

何も返さないことを二重に確認するには、次のように関数呼び出しを行います

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

そして、何が出力されているかを確認します

于 2008-11-26T16:16:48.847 に答える