2017-02-15 19 views
1

変数を上書きしようとしていますが、何とか機能していません。 ここで何が間違っていますか?私の範囲は何ですか?変数を上書きしないのはなぜですか? js

var url = 'BB'; 

    navigator.geolocation.getCurrentPosition(function (position) { 
     url = 'http://maps.googleapis.com/maps/api/geocode/json?latlng=' + position.coords.latitude.toString() + ',' + position.coords.longitude.toString(); 
    }); 

    console.log(url); 

は私urlではなく、出力bbの文字列全体を取得するべきではないのですか?

答えて

4

navigator.geolocation.getCurrentPositionは非同期であり、console.log(url)はあなたがasynchronous実行に精通していない場合は、このスレッドは役立つかもしれないURLに

を上書きするコールバック関数の前に実行されますので、それはです:

Asynchronous vs synchronous execution, what does it really mean?

0

として、 Adam氏は、url変数に値を割り当てる前に('BB'を使用して初期化する以外)変数を使用しようとしていると指摘しました。

あなたはurl、変数グローバル作り、非同期コードの周りの問題を理解するために十分な理由がない限り、あなたがないをすれば、それがベストですが、コールバックの外にこの変数を宣言します。これは、あなたが遭遇したような問題につながります。

代わりに、コールバック内で割り当て先のurlを宣言してください。そして、あなたがコールバックの中か、コールバックの中から呼び出す関数の中で、あなたがする必要があるものは何でもしてください。それをグローバル変数として使用しないでください。

例えば、これはあなたがに走った問題がなくても動作します:

navigator.geolocation.getCurrentPosition(function (position) { 
    var url = 'http://maps.googleapis.com/maps/api/geocode/json?latlng=' + position.coords.latitude.toString() + ',' + position.coords.longitude.toString(); 
    console.log(url); 
}); 
+0

「あなたは間違いなくここでやるべきことの一つは、コールバックの外url変数を宣言できません。」 - それは本当にあなたが最終的にしようとしているものに依存していると思います。 OPは、誰かがコールバック以外のURLを宣言すべきか否かについて特定の判断を下すのに十分な情報を提供していません。 – Adam

+0

@Adamそれは良い点です。おそらく私はあなたがしていることを本当に知っていて、それに対して正当な理由がない限り、「コールバック以外のURLを宣言しないで」と言わなければなりません。結局のところ、コールバックの外でそれを宣言し、コールバックの外でそれを使用しようとすると、問題につながったのです。 –

関連する問題