1

私はここで基本的なJavascriptに本当に苦労しています...基本的に、呼び出されたときに2つの変数(経度と緯度)を設定する関数を作成して、これらの値を使用する他の関数をすぐに実行できるようにしようとしています。

ただし、経度の値を警告しようとすると、未定義で返されます。

これが私のコードです。

var latitude;    
var longitude;

function getLocation() {
  if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(displayLocation);
  } else {
    alert("Geolocation is not supported by this browser.");
  }
}

function displayLocation(position, latitude, longitude) {
  latitude = position.coords.latitude;
  longitude = position.coords.longitude;
  return;
}

function newLocation(longitude) {
  alert(longitude);
}

window.onload = function() {
  getLocation(); 
  newLocation();
}

どんな助けでも真剣に感謝されます!ありがとう。

4

3 に答える 3

2

グローバル変数には何も割り当てません。

の割り当ては、外部のグローバル変数ではなく、displayLocation関数パラメーターlatitude/ (関数内のローカル変数) を参照します。longitude

違う:

var x;

function foo(x) {
  x = 42; // ^ assigns to this x, not the global variable
}

foo(0);
alert(x);  // undefined

右:

var x;

function foo() {
  x = 42;  // no local x in scope here
}

foo();
alert(x);  // 42
于 2012-12-10T22:29:34.633 に答える
2

投稿したコードにはいくつかの問題があります。

への引数displayLocationは、グローバル変数を隠しています。ここで割り当てを行うと、実際にはローカルスコープにある引数変数に割り当てられます。

function displayLocation(position, latitude, longitude) {
  latitude = position.coords.latitude;
  longitude = position.coords.longitude;
}

IIRC、geolocation.getCurrentPosition へのコールバックは最初の引数のみを受け取るため、latitudeandlongitudeを引数として定義する必要はありません。

関数の同じ問題newLocation。引数なしで呼び出しますが、longitude引数はグローバル変数を「隠しています」。

これらは小さな構文の問題です。ただし、コードには別の問題があり、解決するのが少し難しいです。

ページが読み込まれると、次の 2 つの関数を順番に呼び出します。

window.onload = function() {
    getLocation(); 
    newLocation();
}

2 番目の関数 は、グローバル変数が設定されているnewLocationことを想定しています。getLocationただし、そうではない場合もあります。getLocation関数が を呼び出すと、非同期操作geolocation.getCurrentPositionが実行されます。呼び出しの次の行はすぐに実行を続けますが、コールバック関数はまだ呼び出されていない必要があります。これは最初は理解するのが少し複雑かもしれませんが、基本的には実行後にのみ呼び出す必要があります。displayLocationnewLocation 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 をより快適に使用できるようになると思います。

于 2012-12-10T22:33:19.493 に答える
0

あなたのコードには 2 つの問題があります。

まず、 functiondisplayLocationで 2 つの変数latitudeとを使用しlongitude、それらはローカル変数をグローバル変数ではなく関数引数として参照します。これを修正するには、次のように最後の 2 つの関数引数を削除するか、代わりに をdisplayLocation(position)使用します (推奨されません)。window.latitudewindow.longitude

次に、イベントがトリガーされた後、あなたの場合はブラウザーが場所を取得した後に呼び出されるコールバック関数です。そのため、いつ呼び出されるdisplayLocationかわかりません。displayLocationを呼び出しnewLocation()た場合、displayLocationは既に呼び出されている可能性がありlatitudelongitudeはリフレッシュされているか、そうでない可能性があります。そのため、確実に更新されるようalert(longitude);displayLocation関数を配置する必要があります。latitudelongitude

これらが役立つことを願っています。

于 2012-12-10T22:49:00.897 に答える