Google maps 新手javascript范围问题

Google maps 新手javascript范围问题,google-maps,javascript,Google Maps,Javascript,我对什么是作用域略知一二,我对javascript还不熟悉,并且在代码中打了个句号。这是我使用的代码 function initialize() { var mapOptions = { center: new google.maps.LatLng(37.775057,-122.419624), zoom: 8, mapTypeId: google.maps.MapTypeId.ROADMAP }; var ma

我对什么是作用域略知一二,我对javascript还不熟悉,并且在代码中打了个句号。这是我使用的代码

function initialize() {
      var mapOptions = {
        center: new google.maps.LatLng(37.775057,-122.419624),
        zoom: 8,
        mapTypeId: google.maps.MapTypeId.ROADMAP
      };
      var map = new google.maps.Map(document.getElementById("map-canvas"),
          mapOptions);
      }
google.maps.event.addDomListener(window, 'load', initialize);
function clicked(id) {
  $.ajax({
    type: "GET",
    url: 'response.php',
    data: {id: id},
    success: function (lats) {
      var obj = $.parseJSON(lats);
      var line = [];
      for (var i = obj.length - 1; i >= 0; i--) {
        line.push(new google.maps.LatLng(obj[i].latitude, obj[i].longitude));
      };
      var polyPath = new google.maps.Polyline({
    path: line,
    strokeColor: "#FF0000",
    strokeOpacity: 1.0,
    strokeWeight: 2
  });
      polyPath.setMap(map);
      console.log(polyPath);
    }
  });
  return false;
}
不用说它的谷歌地图。
问题在于,由于作用域的原因,javascript无法访问绘制多段线所需的映射变量。非常感谢您的帮助

因为
map
是在函数
initialize
中声明的,所以单击的
无法访问它,您需要在函数
initialize之外声明它

var map = null;
function initialize() {
      var mapOptions = {
        center: new google.maps.LatLng(37.775057,-122.419624),
        zoom: 8,
        mapTypeId: google.maps.MapTypeId.ROADMAP
      };
      map = new google.maps.Map(document.getElementById("map-canvas"),
          mapOptions);
    }
google.maps.event.addDomListener(window, 'load', initialize);
function clicked(id) {
  $.ajax({
    type: "GET",
    url: 'response.php',
    data: {id: id},
    success: function (lats) {
      var obj = $.parseJSON(lats);
      var line = [];
      for (var i = obj.length - 1; i >= 0; i--) {
        line.push(new google.maps.LatLng(obj[i].latitude, obj[i].longitude));
      };
      var polyPath = new google.maps.Polyline({
    path: line,
    strokeColor: "#FF0000",
    strokeOpacity: 1.0,
    strokeWeight: 2
  });
      polyPath.setMap(map);
      console.log(polyPath);
    }
  });
  return false;
}

现在单击的
可以访问它,因为它在
初始化
范围之外

如果您指的是从
初始化
函数中获取map变量,则需要执行以下操作

var map;
function initialize() {
    var mapOptions = {
        center: new google.maps.LatLng(37.775057,-122.419624),
        zoom: 8,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    map = new google.maps.Map(document.getElementById("map-canvas"),
        mapOptions);
}
google.maps.event.addDomListener(window, 'load', initialize);
function clicked(id) {
    $.ajax({
        type: "GET",
        url: 'response.php',
        data: {id: id},
        success: function (lats) {
            var obj = $.parseJSON(lats);
            var line = [];
            for (var i = obj.length - 1; i >= 0; i--) {
                line.push(new google.maps.LatLng(obj[i].latitude, obj[i].longitude));
            };
            var polyPath = new google.maps.Polyline({
                path: line,
                strokeColor: "#FF0000",
                strokeOpacity: 1.0,
                strokeWeight: 2
            });
            polyPath.setMap(map);
            console.log(polyPath);
        }
    });
    return false;
}
我所做的是在initialize函数外部声明
map
。在本例中,它将对您以后可以调用的所有Javascript代码具有全局作用域。initialize函数将能够为您设置它,AJAX调用将能够读取它


在初始化函数之外声明
map
的另一种方法是使用
window.map
,将其指定为window对象上的map属性。由于window对象是全局对象,因此可以在任何地方访问它,您只需调用
window.map
即可在任何地方对其进行读写。

一个快速但不推荐的解决方案是删除map前面的
var
,使其成为全局变量。

您可以将
map
移动到全局范围

var map;
function initialize() {
    ...
    map = ....;
}
如果您担心污染全局作用域,可以将这两者都放在一个函数中以保留名称空间:

(function() {
     var map;
     function initialize() {
         ...
         map = ....;
     }
     ...(everything else) ...
})();

在控制台中尝试
var iDontKnowAGoodVarName=“Hello window!”;console.log(window.iDontKnowAGoodVarName),如果变量未在任何范围内执行,则该变量将自动附加到窗口:)Yep。但是,在函数中,要在窗口对象上获取它,您需要手动设置
窗口。否则,它会被卡在本地范围内。如果为false,请选中它
window.stillDontKnowAGoodOne=“Inception v2.1b”;(function(){console.log(stillDontKnowAGoodOne);})(
,还是将其分配给
窗口
对象?我的意思更像这样:
(function(){window.myVar=“abc”;})()//myVar==“abc”:true
如果您对所有内容都使用全局变量,那么在使用相同名称时,其他代码可能会发生冲突您只需要在编写插件或其他内容时严格执行,在项目中使用全局变量没有错,只要你有一个列表,上面有所有全局的:)这样你就不会有冲突;)2013年5月6日,我真是个笨蛋。全球化是不好的。地球人是非地球人。