投稿したコードにはいくつかの問題があります。
への引数displayLocation
は、グローバル変数を隠しています。ここで割り当てを行うと、実際にはローカルスコープにある引数変数に割り当てられます。
function displayLocation(position, latitude, longitude) {
latitude = position.coords.latitude;
longitude = position.coords.longitude;
}
IIRC、geolocation.getCurrentPosition へのコールバックは最初の引数のみを受け取るため、latitude
andlongitude
を引数として定義する必要はありません。
関数の同じ問題newLocation
。引数なしで呼び出しますが、longitude
引数はグローバル変数を「隠しています」。
これらは小さな構文の問題です。ただし、コードには別の問題があり、解決するのが少し難しいです。
ページが読み込まれると、次の 2 つの関数を順番に呼び出します。
window.onload = function() {
getLocation();
newLocation();
}
2 番目の関数 は、グローバル変数が設定されているnewLocation
ことを想定しています。getLocation
ただし、そうではない場合もあります。getLocation
関数が を呼び出すと、非同期操作geolocation.getCurrentPosition
が実行されます。呼び出しの次の行はすぐに実行を続けますが、コールバック関数はまだ呼び出されていない必要があります。これは最初は理解するのが少し複雑かもしれませんが、基本的には実行後にのみ呼び出す必要があります。displayLocation
newLocation
displayLocation
だから複雑になる?そのため、グローバル変数を完全に回避することをお勧めします。Javascript はしばしば私たちに非同期プログラミングを強いるものであり、ある時点でグローバル変数が取りうるすべての状態を理解しようとすると気が狂ってしまう可能性があります。
代わりに、可能であれば、常に関数の引数を直接使用する必要があります。たとえば、シナリオでは、displayLocation
手順を完全にスキップして、次の手順に直接進むことができnewLocation
ます。
function getLocation() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(newLocation);
} else {
alert("Geolocation is not supported by this browser.");
}
}
function newLocation(position) {
alert(position.longitude);
}
そのため、グローバル変数は不要になりました。
投稿されたサンプル コードは単純化されており、実際のコードはより複雑になっていると思いますが、これらの原則に従うことができれば、JavaScript をより快適に使用できるようになると思います。