2017-02-27 23 views
0

私はC++とJavaのバックグラウンドを持っています。私はJavaScriptで関数呼び出しを理解することにいくつかの問題を抱えています。JavaScriptスコープと関数呼び出し

以下は私のコード例です。私は変数lonとlat#4を宣言しました。 5行目と6行目に値を割り当てます。

私の質問ですが、#1のwriteToTes()を呼び出しました。しかし、#2や#3にwriteToTes()を置くと、lonとlatは空になりません。何故ですか? (navigator.geolocation){}、latとlonがすでに割り当てられている必要があります。なぜ私がwriteToTes()の呼び出しを行ったのですか?lonとlatはまだ空です。

var lon = '', 
 
    lat = ''; // #4 
 

 
$(document).ready(function() { 
 
    setLonLat(); 
 
}); 
 

 
function setLonLat() { 
 
    if (navigator.geolocation) { 
 
    navigator.geolocation.getCurrentPosition(function(position) { 
 
     lat = (position.coords.latitude); //#5 
 
     lon = (position.coords.longitude); //#6 
 
     writeToTes(); //#place it Here #1 
 
    }); 
 
    //#place it Here #2 
 
    } 
 
    //#place it Here #3 
 
} 
 

 
function writeToTes() { 
 
    $("#tes").html(lon + " " + lat); 
 
}

+2

これは非同期性のためです。そのため、コールバック関数を渡すのは、結果が受け取られたときに呼び出されます。変数をコールバックハンドラの外に置くと、何かが割り当てられる前の状態であることがわかります – baao

答えて

6

getCurrentPosition()は非同期操作であるためです。 getCurrentPosition()に渡す関数は、コールバック関数と呼ばれます。現在の位置が取得された後、この関数に挿入されたコードが実行されます。

getCurrentPosition()のコールの後にwriteToTest()を配置すると、getCurrentPosition()が実行を終了する前に実行されます。したがって、latおよびlonはまだ割り当てられていません。

+0

コールバック関数で割り当てられた変数を保持する方法はありますか?それでもコールバック関数の外部にアクセスできるのでしょうか? –

+0

コールバック関数の外でもそれにアクセスすることはできますが、割り当てられているかどうかわからないため、これは適切ではありません。したがって、コールバック内の場所に応じてすべてのコードを実行する必要があります。このコードをもっときれいにしたい場合は、Promisesを使用してください。 –

+0

@Hadaz Zeilbergerありがとう! –

0

ボタンクリックでeventhandlerを追加するようなものです。 eventhandlerは、ボタンがクリックされた後にのみ起動します。この場合、ジオロケーションを取得するとeventhandlerまたはcallbackが呼び出されます。コールバックには、latlonのデータが含まれています。

関連する問題