需要帮助Javascript范围

时间:2011-09-28 20:24:28

标签: javascript jquery scope

我需要一些帮助来理解Javascript中的范围。我之前发布了一个类似的问题并过早地将其标记为已被接受。 (解决方案在我的情况下不起作用)。

我有javascript(a)和jQuery脚本(b)。我需要从(a)中的(a)中访问一些值。

在(a)我得到了:

function map_maker_js( args ) {
 var map = new google.maps.Map(document.getElementById( args['id'] ), myOptions);
//rest of the code for building the map goes here

google.maps.event.addListener(map, 'tilesloaded', viewport_bounds);

function viewport_bounds() {
    var bounds = map.getBounds();
    var ne = bounds.getNorthEast();
    var sw = bounds.getSouthWest();

    var maxLat = ne.lat();
    var maxLong = ne.lng();
    var minLat = sw.lat();
    var minLong = sw.lng();

    var the_maps_bounds = [maxLat, maxLong, minLat, minLong];

    //return(the_maps_bounds);

 }

}

在jQuery脚本(b)中,我需要__psps_bounds,它由viewport_bounds()计算。我不能简单地将google.maps.event.addListener(map, 'tilesloaded', viewport_bounds);移到(b)中,因为'map'超出了范围。这在(b)中不起作用:

google.maps.event.addListener(map, 'tilesloaded',  function() {
    // This code will only execute after event `tilesloaded` happens

    var the_maps_bounds = viewport_bounds()

    // now do something with the bounds
    // ...
});

如果我将viewport_bounds()函数移到map_maker_js之外,那么我将不得不将map添加为参数,这在(b)中也不起作用。

我正在处理的代码是在WordPress插件中。不过,我认为这不会影响答案。

我正在学习仍在学习javascript。解决这个问题的最佳方法是什么?

谢谢


更新

谢谢Rob W的建议。这就是我现在所拥有的:

var the_maps_bounds;

function map_maker_js( args ) {
     var map = new google.maps.Map(document.getElementById( args['id'] ), myOptions);
    //rest of the code for building the map goes here

    google.maps.event.addListener(map, 'tilesloaded', viewport_bounds);

    function viewport_bounds() {
        var bounds = map.getBounds();
        var ne = bounds.getNorthEast();
        var sw = bounds.getSouthWest();

        var maxLat = ne.lat();
        var maxLong = ne.lng();
        var minLat = sw.lat();
        var minLong = sw.lng();

        the_maps_bounds = [maxLat, maxLong, minLat, minLong];

        alert(the_maps_bounds); //is the the_map_bounds working

        return(the_maps_bounds);

     }

    }

在剧本(b)中,我有:

jQuery.noConflict();

jQuery(document).ready(function($) { //how jQuery scripts are written in WordPress

 alert(window.the_maps_bounds);

//rest of my functions

});

当我查看页面时,我在警告框中显示“未定义”,然后是一个带有lat longs的警告框。我也尝试了没有'窗口'的警报。在准备好的活动上:

$('#map').ready(function() {
     alert(the_maps_bounds);
 });

我猜脚本(b)中的the_maps_bounds没有soem原因的值。在脚本(a)中设置其值之前是否触发警报?还有别的事吗?有任何想法吗?谢谢。

1 个答案:

答案 0 :(得分:1)

var声明之前移除the_maps_bound,然后使用此代码:

var the_maps_bound;
function map_maker_js( args ) {
 var map = new google.maps.Map(document.getElementById( args['id'] ), myOptions);
//rest of the code for building the map goes
....

这样,您可以在这些函数的范围之外定义the_maps_bound。如果您的函数是在全局范围(window)中定义的,则the_maps_bound变量也可以通过window.the_maps_bound访问。 注意:var声明必须位于最近的共享父作用域才能使代码正常工作(有关详细解释,请参阅下文)。

使用var是一种很好的做法,可以防止泄漏到全球范围。如果已在父作用域中定义了变量,则省略本地作用域内的var将不会泄漏到全局作用域。相反,将使用最接近的变量(即定义变量的最近范围)。如果没有这样的变量,全局范围将用于存储变量。