1

我真的在这里与基本的 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();
}

任何帮助将不胜感激!谢谢。

4

3 回答 3

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
于 2012-12-10T22:29:34.633 回答
2

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

的参数displayLocation是隐藏你的全局变量。当您在这里进行分配时,您实际上是在分配给您的参数变量,这些变量位于本地范围内。

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

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

函数中的同样问题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。

于 2012-12-10T22:33:19.493 回答
0

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

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

其次,displayLocation是一个回调函数,将在事件触发后调用,在你的情况下,在浏览器获取位置之后。所以你不知道什么时候displayLocation被调用。如果您调用newLocation(),可能displayLocation已经被调用并且latitudelongitude已经刷新,可能没有。所以你应该alert(longitude);displayLocation功能中确保latitudelongitude被刷新。

希望这些帮助。

于 2012-12-10T22:49:00.897 回答