2011-04-02 157 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