我需要一些帮助来理解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)中设置其值之前是否触发警报?还有别的事吗?有任何想法吗?谢谢。
答案 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
将不会泄漏到全局作用域。相反,将使用最接近的变量(即定义变量的最近范围)。如果没有这样的变量,全局范围将用于存储变量。