关于变量:非常奇怪的Javascript范围问题

Very strange Javascript scoping issue

以下变量my_cords在进入谷歌地图功能时未定义,任何人都可以理解为什么并且可能给我一个解决方法吗? 我已经在顶部定义它并将其设置在回调函数中,我已经看到它在全局变量之前工作了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
$(document).ready(function () {

var my_cords;
var map;

function getCareHome() {

    geocoder = new google.maps.Geocoder();

    //var address = document.getElementById("address").value;

    var address ="address here";

    geocoder.geocode( { 'address': address}, function(results, status) {

        if (status == google.maps.GeocoderStatus.OK) {

            my_cords = results[0].geometry.location;

        } else {

            alert("Sorry we couldn't locate the carehome on the map:" + status);
            return false;

        }

    });



    var myOptions = {
        zoom: 7,
        center: my_cords,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    }

    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

}

getCareHome();

});

geocoder.geocode是一个异步函数。 设置my_cords的匿名函数在某些事件(可能是HTTP响应的到来)触发之前不会运行。

将依赖于它的代码移动到该函数内部。


.geocode是异步调用。

尝试在函数中使用回调。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
geocoder.geocode( { 'address': address}, function(results, status) {

    if (status == google.maps.GeocoderStatus.OK) {

        createMap(results[0].geometry.location);

    } else {

        alert("Sorry we couldn't locate the carehome on the map:" + status);
        return false;

    }

});

var createMap = function(my_cords)  {
     var myOptions = {
        zoom: 7,
        center: my_cords,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    }

    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
}


因为geocode以异步方式运行,所以稍后使用my_cords(设置myOptions)的代码将在geocode运行完成回调之前看到my_cords的值— 因此myOptions.center将是undefined

如果在设置myOptions时需要my_cords,则必须将该代码移动到geocode上的回调中。