全局变量表示未定义,除非我使用它两次

时间:2017-01-25 21:09:56

标签: javascript variables

当我运行它时,变量elevationPoint在第一个警报上未定义。我意外地注意到它适用于第二个警报。那是为什么?

var elevator = new google.maps.ElevationService();
var coordinates = new google.maps.LatLng(closestLat , closestLng);
var pointElevation;
elevator.getElevationForLocations({
    'locations':[coordinates]
    }, function (results, status) {
    if (status == google.maps.ElevationStatus.OK) {

        // Retrieve the first result
        if (results[0]) {
            pointElevation = results[0].elevation;
           
        } else {
            alert('No results found');
        }
    }
    else {
        alert('Elevation service failed due to: ' + status);
    }
});
alert(pointElevation);
alert(pointElevation);

2 个答案:

答案 0 :(得分:0)

因为pointElevation是在异步调用getElevationForLocations()中定义的。第二次警报是偶然的,因为那时异步调用已经完成,但是不能保证。

答案 1 :(得分:0)

您将回调传递给正在使用的API这一事实让我觉得它是异步的。

当您发出第一个警报时,异步任务尚未完成。当第二个警报触发时,回调已完成,并且您获得了youbexoex变量的预期值。尝试在传递给API的函数中移动警报,它应该可以工作。

问候

修改以清除阻止/非阻止主题

需要回调的函数通常是异步的,它们在一个名为eventLoop的独立线程上运行。代码在评估后立即执行,因此您的API调用会立即触发,并将其置于事件循环中。当第一个警报到达时,异步操作已经在eventLoop上,因此虽然警报阻止但它不能阻止在单独的线程上运行的代码。当执行第二个警报时,异步代码已经完成并且执行了回调,这就是为什么你可以看到第二个警报上的值。

我建议您调查事件循环及其工作原理 这是一个很棒的视觉解释https://m.youtube.com/watch?v=8aGhZQkoFbQ