0

私はJavascriptが初めてで、次のコードは私を混乱させています。私の理解では、変数の前に var をドロップすることでグローバル変数に値を割り当てることができ、最初にグローバルを宣言するときに初期値を定義する必要はありません。しかし、次のコードが機能しないのはなぜですか? (機能しないということは、main() 内の document.write の呼び出しが「ulat」に対して「undefined」を吐き出すことを意味します)。

var ulat;

function write(latitude) {
    ulat = latitude;
    document.write("<h1> This works:" + ulat + "</h1>");
}

function getloc() {

            if (navigator.geolocation) {
                navigator.geolocation.getCurrentPosition(
                function(position) {
                    write(position.coords.latitude);
                },
                function (error) {
                    switch(error.code) {
                        case error.TIMEOUT:
                            alert ('Timeout');
                            break;
                        case error.POSITION_UNAVAILABLE:
                            alert ('Position unavailable');
                            break;
                        case error.PERMISSION_DENIED:
                            alert ('Permission denied');
                            break;
                        case error.UNKNOWN_ERROR:
                            alert ('Unknown error');
                            break;
                    }
                });

            }
            else {
                alert("Geolocation is not supported by your web browser.");                 
            }       
}


function main() {
      getloc();
      document.write("<h1> This doesn't work: " + ulat + "</h1>");
}

何か助けはありますか?ありがとう!

4

3 に答える 3

4

getCurrentPosition非同期です。呼び出したときに実行されるのではなく、呼び出したときに実行が開始されます。そのため、 が値をチェックするときmain、成功のコールバックは呼び出されておらず、 には何も割り当てられていませんulat

したがって、コードは次のようになります。

  1. main呼ばれる
  2. main通話getloc
  3. getloc位置情報が利用可能であることを確認し、位置情報リクエストを開始します。その後、すぐに戻ります。
  4. mainの値を出力しますがulat、これはまだundefinedです。
  5. しばらくして、successコールバック (または、もちろん失敗) が呼び出されます。その時点で、ページが空白にならないことに少し驚いています。これは、ページを破棄して白紙の状態で始まる をdocument.write意味するメインの解析の後に呼び出すためです。しかし、私はすべての気まぐれを思い出すのに十分な頻度でdocument.open使用していません...document.write
于 2011-04-02T16:35:55.047 に答える
0

mainを呼び出す必要があります:'main();'

于 2011-04-02T16:31:47.863 に答える
-1

varローカル変数用です。グローバル変数の場合は、参照を単独で、またはとして指定しwindow.referenceます。コードを変更して、最初の行を削除してみてくださいvar ulat;

于 2011-04-02T16:31:10.783 に答える