2010-06-03 130 views
2

这是一个简单的问题,但我无法解决。javascript中的变量范围

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

var lat = 0; 
var lon = 0; 

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

我觉得它做的是:

  1. 设置纬度和经度,以0
  2. 如果浏览器地理位置,覆盖这些变量与实际值

但是,在该块的末尾,lat和lon仍然是0.我试过加入var s,将lat和lon传递给函数等,但没有成功...

我该如何做这项工作?

+0

啊,答案很有意义。我知道这是异步的,但我不习惯用那种风格进行编程。那么我如何专门做这项工作呢?在这个块之后,我使用ajax来访问一个API,并且不想重复这个代码两次,这取决于我们是否知道位置。 – 2010-06-03 12:19:25

+0

将呼叫置于其他API *内*从'getCurrentPosition'回调 – Pointy 2010-06-03 12:38:34

回答

6

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

另请参阅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 
}); 

您不必使用匿名函数。

2

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

1

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

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

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