我的全局变量返回为未定义(JavaScript)

我的全局变量返回为未定义(JavaScript),javascript,Javascript,我真的很难在这里使用基本的Javascript。。。基本上,我试图创建一个函数,在调用时设置两个变量(经度和纬度),这样我就可以直接运行使用这些值的其他函数 但是,当我试图警告经度值时,它返回时未定义 这是我的密码 var latitude; var longitude; function getLocation() { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(display

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

我们将非常感谢您的帮助!谢谢。

您从未为全局变量赋值

displayLocation
中的赋值指的是函数参数
纬度
/
经度
(它们是函数中的局部变量),而不是外部的全局变量

错:

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

您从不将任何内容分配给全局变量

displayLocation
中的赋值指的是函数参数
纬度
/
经度
(它们是函数中的局部变量),而不是外部的全局变量

错:

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

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

displayLocation
的参数隐藏了全局变量。在这里进行赋值时,实际上是在为参数变量赋值,这些变量在局部范围内

function displayLocation(position, latitude, longitude) {
  latitude = position.coords.latitude;
  longitude = position.coords.longitude;
}
IIRC中,对geolocation.getCurrentPosition的回调只接受第一个参数,因此您不必将
纬度
经度
定义为参数

newLocation
函数中也存在同样的问题。您可以在没有参数的情况下调用它,但是
经度
参数“隐藏”了全局变量

这些都是小的语法问题。然而,代码中还有另一个问题,解决起来有点棘手

加载页面时,可以顺序调用两个函数:

window.onload = function() {
    getLocation(); 
    newLocation();
}
第二个函数,
newLocation
,要求
getLocation
已设置全局变量。然而,情况可能并非如此。当
getLocation
函数调用
geolocation.getCurrentPosition
时,它正在执行一个异步操作。调用后的下一行继续立即执行,但回调函数
displayLocation
不一定被调用。起初理解起来可能有点复杂,但基本上您只需要在运行
displayLocation
后调用
newLocation

所以事情变得复杂了?这就是为什么人们认为尽量避免使用全局变量是一种好的做法。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的时间会更好。

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

displayLocation
的参数隐藏了全局变量。在这里进行赋值时,实际上是在为参数变量赋值,这些变量在局部范围内

function displayLocation(position, latitude, longitude) {
  latitude = position.coords.latitude;
  longitude = position.coords.longitude;
}
IIRC中,对geolocation.getCurrentPosition的回调只接受第一个参数,因此您不必将
纬度
经度
定义为参数

newLocation
函数中也存在同样的问题。您可以在没有参数的情况下调用它,但是
经度
参数“隐藏”了全局变量

这些都是小的语法问题。然而,代码中还有另一个问题,解决起来有点棘手

加载页面时,可以顺序调用两个函数:

window.onload = function() {
    getLocation(); 
    newLocation();
}
第二个函数,
newLocation
,要求
getLocation
已设置全局变量。然而,情况可能并非如此。当
getLocation
函数调用
geolocation.getCurrentPosition
时,它正在执行一个异步操作。调用后的下一行继续立即执行,但回调函数
displayLocation
不一定被调用。起初理解起来可能有点复杂,但基本上您只需要在运行
displayLocation
后调用
newLocation

所以事情变得复杂了?这就是为什么人们认为尽量避免使用全局变量是一种好的做法。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的时间会更好。

我发现您的代码中有两个问题

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

其次,
displayLocation
是ca