我的全局变量返回undefined(JavaScript)

时间:2012-12-10 22:24:32

标签: javascript

我真的在这里努力学习基本的Javascript ...基本上,我正在尝试创建一个函数,在调用时,设置两个变量(经度和纬度),以便我可以直接运行其他函数,使用这些值。

当我尝试提醒经度值时,它会返回未定义。

这是我的代码。

var latitude;    
var longitude;

function getLocation() {
  if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(displayLocation);
  } else {
    alert("Geolocation is not supported by this browser.");
  }
}

function displayLocation(position, latitude, longitude) {
  latitude = position.coords.latitude;
  longitude = position.coords.longitude;
  return;
}

function newLocation(longitude) {
  alert(longitude);
}

window.onload = function() {
  getLocation(); 
  newLocation();
}

任何帮助都将受到重视!感谢。

3 个答案:

答案 0 :(得分:2)

您永远不会为全局变量指定任何内容。

displayLocation中的赋值引用函数参数latitude / longitude(函数中的局部变量),而不是外部的全局变量。

错:

var x;

function foo(x) {
  x = 42; // ^ assigns to this x, not the global variable
}

foo(0);
alert(x);  // undefined

右:

var x;

function foo() {
  x = 42;  // no local x in scope here
}

foo();
alert(x);  // 42

答案 1 :(得分:2)

您发布的代码存在一些问题:

displayLocation的参数隐藏了全局变量。在此处进行分配时,实际上是在为参数变量分配,这些变量位于本地范围内。

function displayLocation(position, latitude, longitude) {
  latitude = position.coords.latitude;
  longitude = position.coords.longitude;
}

IIRC,对geolocation.getCurrentPosition的回调只接受第一个参数,因此您不必将latitudelongitude定义为参数。

newLocation函数中的相同问题。你可以不带参数调用它,但longitude参数是“隐藏”全局变量。

这些是小的语法问题。但是代码中还有另一个问题,有点难以解决。

加载页面后,您可以按顺序调用这两个函数:

window.onload = function() {
    getLocation(); 
    newLocation();
}

第二个函数newLocation期望getLocation设置全局变量。然而,情况可能并非如此。当getLocation函数调用geolocation.getCurrentPosition时,它正在执行异步操作。调用后的下一行继续立即执行,但回调函数displayLocation尚未被调用。首先要理解这一点有点复杂,但基本上你只需要在 newLocation运行后调用displayLocation

所以它变得复杂了?这就是为什么尝试完全避免全局变量被认为是一种好习惯。 Javascript经常强迫我们进行异步编程,并试图理解全局变量在任何给定时间可能存在的所有可能状态可能会让你发疯。

相反,如果可能,您应该始终直接使用函数参数。例如,在您的方案中,您可以完全跳过displayLocation步骤,直接转到newLocation

function getLocation() {
  if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(newLocation);
  } else {
    alert("Geolocation is not supported by this browser.");
  }
}

function newLocation(position) {
    alert(position.longitude);
}

因此不再需要全局变量。

我确信您发布的示例代码已经过简化,而且您的实际代码更复杂,但如果您能够遵循这些原则,我认为您将有更好的时间使用javascript。

答案 2 :(得分:0)

我在你的代码中发现了2个问题。

首先,在函数displayLocation中,使用2变量latitudelongitude,它们将局部变量称为函数参数,而不是全局变量。要解决此问题,请删除最后两个函数参数:displayLocation(position)或使用window.latitudewindow.longitude代替(不推荐)。

其次,displayLocation是一个回调函数,在触发事件后将调用,在您的情况下,在浏览器获取位置后调用。因此您不知道何时调用displayLocation。如果您致电newLocation(),可能已拨打displayLocationlatitudelongitude已刷新,可能不会。因此,您应该将alert(longitude);放入displayLocation函数中,以确保latitudelongitude被刷新。

希望这些帮助。