0

我是 Javascript 的新手,下面的代码让我很困惑。据我了解,您可以通过将 var 放在它们前面来为全局变量赋值,并且在首先声明全局时不需要定义任何初始值。但是,为什么下面的代码不起作用?(不工作是指在 main() 中对 document.write 的调用会为“ulat”吐出“未定义”)。

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在主解析之后调用,这意味着 a 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 回答