javascript中的变量范围

时间:2010-06-03 12:05:39

标签: javascript

这是一个简单的问题,但我无法解决。

具体细节并不重要,但这是要点。我有一些像这样的代码:

var lat = 0;
var lon = 0;

if (navigator.geolocation) {    
    navigator.geolocation.getCurrentPosition(function(position) {
        lat = position.coords.latitude;
        lon = position.coords.longitude;
    });
}

我认为它的作用是:

  1. 将lat和lon设置为0
  2. 如果浏览器具有地理位置,请使用实际值覆盖这些变量
  3. 然而,在那个块的末尾,lat和lon仍为0.我尝试添加var s,将lat和lon传递给函数等但没有成功......

    我如何使这项工作?

3 个答案:

答案 0 :(得分:6)

这是一个异步回调。基本上,您将函数传递给导航器API。然后,您的代码继续(并做任何事情)。稍后,导航器API会使用答案(位置)调用您的回调。因此,任何使用position的东西都必须在回调内部(包括被调用)。

另请参阅this previous answer,其中显示了如何创建和使用包装函数。

编辑:您可以简单地编写一个调用回调的函数。如果需要,getLocation可以将另一个标志传递给其参数(例如,失败/成功代码)。

function getLocation(callback)
{
    if (navigator.geolocation) {    
        navigator.geolocation.getCurrentPosition(callback);
    }
    else {
        callback(null);
    }
}

然后:

getLocation(function(pos)
{
  //do stuff
  if(pos != null)
  {
    // loc stuff
  }
  // more stuff
});

您不必使用匿名函数。

答案 1 :(得分:2)

这与范围无关。 getCurrentPosition被异步调用,这意味着它将在收到位置之前立即返回。只有在实际接收到地理位置时才会调用function(position)

答案 2 :(得分:1)

getCurrentPosition()是异步的 - 值不会立即更新。

  

getCurrentPosition()方法需要一个,两个或三个参数。调用时,必须立即返回,然后异步尝试获取设备的当前位置。如果尝试成功,则必须使用新的Position对象调用successCallback(即必须在回调对象上调用handleEvent操作),以反映设备的当前位置。如果尝试失败,则必须使用新的errorCallback对象调用PositionError,以反映失败的原因。

alert函数中的值,您将看到更改。编写代码以在函数内执行您想要的任何操作(或将它们抽象到另一个函数并从那里调用它),而不是在if块之后继续。为安全起见,也要添加错误回调。