2011-08-22 202 views
1

我在訪問JavaScript中附加到窗口的全局變量時遇到了一些問題。 這是我所使用的腳本標籤嵌在我的索引頁我的代碼片段可以說訪問全局變量的問題

var Geolocation = function() { 
    var self = this; 

    self.errors = { 
    TIMEOUT: 1, 
    POSITION_UNAVAILABLE: 2, 
    PERMISSION_DENIED: 3, 
    UNKNOWN_ERROR: 4 
    }; 

    self.getCurrentPosition = function(success, error, options) { 
    // simulate the wait for the user choice 
    var geoIntervalId = window.setInterval(function() { 
     if (state != null) { 
     window.clearInterval(geoIntervalId); 

     switch(state) { 
      case 'ok': 
      success(new Position(latitude, longitude)); 
      break; 
      case 'timeout': case 'position_unavailable': case 'permission_denied': 
      error(new GeolocationError(self.errors[state.toUpperCase()])); 
      break; 
      default: 
      error(new GeolocationError(self.errors.UNKNOWN_ERROR)); 
     } 
     } 
    }, 100); // ms 
    }; 
} 

var Position = function(lat, lng) { 
    this.coords = new Coordinates(lat, lng); 
} 

var Coordinates = function(lat, lng) { 
    this.latitude = lat; 
    this.longitude = lng; 
} 

var GeolocationError = function(code) { 
    this.TIMEOUT = 1; 
    this.POSITION_UNAVAILABLE = 2; 
    this.PERMISSION_DENIED = 3; 
    this.UNKNOWN_ERROR = 4; 

    this.code = code; 
} 

var state  = null, 
    latitude = null, 
    longitude = null; 

window.geolocation_provider = new Geolocation(); 

這之後我還包括另一個javascript文件說,在索引文件test.js再次使用的腳本。現在,當我嘗試訪問window.geolocation_provider變量時,它變爲空。爲什麼如此

+0

我的第一個建議是與外部.js文件打交道時,被檢查的執行順序。這是我在處理JS時遇到的一個常見問題。這會導致null頻繁出現。 – MaxSan

+0

值爲空還是未定義?執行順序的問題肯定會導致未定義的值。要驗證問題是否與第二個文件相關,請在調用Geolocation之後放置「alert(window.geolocation_provider)」,然後查看該值是什麼。在test.js文件中,如何引用geiolocation_provider? – HBP

回答

1

問題可能是某些文件在其他文件之前/之後執行;理想情況下,通過確保在執行任何重要代碼之前加載所有JavaScript函數定義來解決此問題。

你可能想看看在JavaScript中的Module pattern。還有一些其他問題可以解決這個問題,such as this one

0

試試這個

(function(window){ 
    var Geolocation = function() { 
    var self = this; 

    self.errors = { 
    TIMEOUT: 1, 
    POSITION_UNAVAILABLE: 2, 
    PERMISSION_DENIED: 3, 
    UNKNOWN_ERROR: 4 
    }; 

    self.getCurrentPosition = function(success, error, options) { 
    // simulate the wait for the user choice 
    var geoIntervalId = window.setInterval(function() { 
     if (state !== null) { 
     window.clearInterval(geoIntervalId); 

     switch(state) { 
      case 'ok': 
      success(new Position(latitude, longitude)); 
      break; 
      case 'timeout': case 'position_unavailable': case 'permission_denied': 
      error(new GeolocationError(self.errors[state.toUpperCase()])); 
      break; 
      default: 
      error(new GeolocationError(self.errors.UNKNOWN_ERROR)); 
     } 
     } 
    }, 100); // ms 
    }; 
}; 

var Position = function(lat, lng) { 
    this.coords = new Coordinates(lat, lng); 
}; 

var Coordinates = function(lat, lng) { 
    this.latitude = lat; 
    this.longitude = lng; 
}; 

var GeolocationError = function(code) { 
    this.TIMEOUT = 1; 
    this.POSITION_UNAVAILABLE = 2; 
    this.PERMISSION_DENIED = 3; 
    this.UNKNOWN_ERROR = 4; 

    this.code = code; 
}; 

var state  = null, 
    latitude = null, 
    longitude = null; 
if(window.geolocation_provider === undefined){ 
    window.geolocation_provider = new Geolocation(); 
} 
})(window ? window : this)