2011-04-02 154 views
0

我是新来的Javascript和下面的代码是混淆了我的地狱。根据我的理解,您可以通过将var放在它们前面来为全局变量赋值,并且在首先声明全局时不需要定义任何初始值。但是,为什么下面的代码不起作用? (通过不工作我的意思是在main()中调用document.write时吐出“undefined”为“ulat”)。JavaScript中的全局变量?

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>"); 
} 

任何帮助?谢谢!

+0

你曾经调用'main()'吗? – climbage 2011-04-02 16:30:59

+0

当你承认存在'document.write'时,我建议不要创建一个名为'write'的函数。 – mVChr 2011-04-02 16:31:33

+3

当你说“不工作”时,更具体的做法是一个很好的做法。 – hugomg 2011-04-02 16:31:44

回答

-1

var用于局部变量。对于全局变量,请单独给出或作为window.reference。尝试修改您的代码以删除第一行var ulat;

+1

'var'对全局和本地人一样多。请注意,全局变量是应该避免的。 – 2011-04-02 16:33:37

0

您需要调用main: 'main();'

+0

main被调用,其中还有其他操作可以正常工作 – Dan 2011-04-02 16:33:05

3

getCurrentPosition异步。当你打电话时它不会运行,当你打电话时开始运行。所以当main检查一个值时,成功回调没有被调用,并且没有任何东西被分配给ulat

因此,这里是你的代码做什么:

  1. main被称为
  2. main电话getloc
  3. getloc看到的是地理位置信息,并将开始地理位置请求。然后立即返回。
  4. main输出值ulat,该值仍然为undefined
  5. 一段时间后,您的success回调(或当然,失败)被调用。在这一点上,我有点惊讶你的页面没有变为空白,因为你在主解析之后会调用document.write,这意味着document.open,这会撕下页面并以空白的页面开始。但我并不经常使用document.write来记住所有的变幻莫测...
+0

这很有道理。那么我能做些什么来解决它?这个代码的最终目的是让lat和long的全局变量能够在其他地方使用(即,在网站上显示以及添加到谷歌地图) – Dan 2011-04-02 16:37:45

+0

@Dan:删除文档。写'电话,你是金,最终'ulat'将有价值(如果地理电话工作)。在页面的主要解析完成后,您不能使用'document.write',所以您需要使用[DOM API](http://www.w3.org/DOM/DOMTR)或您最喜欢的库 - 像[jQuery](http://jquery.com),[Prototype](http://prototypejs.org),[YUI](http://developer.yahoo.com/yui/),[Closure ](http://code.google。(http://en.wikipedia.org/wiki/List_of_JavaScript_libraries) - 修改页面后渲染的内容。 – 2011-04-02 16:40:29

+0

@丹:但我会建议避免全局变量。如果将整个脚本放入范围函数中,则可以在该函数中包含所有需要的局部变量,而不会与全局名称空间中的其他事物发生冲突,而这些其他事物已经*真正*杂乱(特别是在IE上) 。以下是使用范围函数(HTML窗格底部的代码)的示例:http://jsbin.com/usoca3/2/edit – 2011-04-02 16:44:41