2017-02-27 133 views
0

我有C++和Java背景。我在使用JavaScript调用函数调用时遇到了一些麻烦。JavaScript范围和函数调用

以下是我的代码示例,我声明变量lon和lat#4。并在#5和#6行上赋值。

这是我的问题,我打电话给#1上的writeToTes(),它工作。但是,当我在#2或#3上放置writeToTes()时,lon和lat是空的,就像它从未分配过的一样。这是为什么?

根据我的逻辑,我们已经执行,如果(navigator.geolocation){},lat和lon应该已经分配,​​为什么当我调用writeToTes()lon并且lat仍然是空的。

var lon = '', 
 
    lat = ''; // #4 
 

 
$(document).ready(function() { 
 
    setLonLat(); 
 
}); 
 

 
function setLonLat() { 
 
    if (navigator.geolocation) { 
 
    navigator.geolocation.getCurrentPosition(function(position) { 
 
     lat = (position.coords.latitude); //#5 
 
     lon = (position.coords.longitude); //#6 
 
     writeToTes(); //#place it Here #1 
 
    }); 
 
    //#place it Here #2 
 
    } 
 
    //#place it Here #3 
 
} 
 

 
function writeToTes() { 
 
    $("#tes").html(lon + " " + lat); 
 
}

+2

这是因为异步性,这就是为什么你传递回调函数 - 当收到结果时调用它。如果将变量放置在回调处理程序之外,您会在分配东西之前看到它处于状态 – baao

回答

6

这是因为getCurrentPosition()是一个异步操作。您传递给getCurrentPosition()的函数称为回调函数。放入此函数的任何代码在获取当前位置后执行。

当您在拨打getCurrentPosition()后放置writeToTest()时,它在getCurrentPosition()执行完毕之前执行。因此,latlon尚未分配到。

+0

有没有办法保留在回调函数中分配的变量,并仍然能够访问回调函数以外的变量? –

+0

您仍然可以在回调函数外访问它,但这不是一件好事,因为您不知道它何时被分配。因此,您希望根据回调中的位置执行所有代码。如果你想使这个代码更整洁,使用Promises。 –

+0

@Hadaz Zeilberger谢谢! –

0

这就像添加一个按钮点击eventhandler。一旦按钮被点击,eventhandler只会触发。在这种情况下,当您获取地理位置时,将调用您的eventhandlercallback。您回调的位置包含您的latlon数据。