Javascript对象文字范围问题?
我很难理解为什么Javascript对象文字范围问题?,javascript,jquery,scope,Javascript,Jquery,Scope,我很难理解为什么这个。$map和这个。标记是未定义的。以下是我正在使用的代码,我添加了注释,希望这些变量提供一个值: (function($) { 'use strict'; var A = { /** * Initialize the A object */ init: function() { this.$map = this.renderMap(); th
这个。$map
和这个。标记是未定义的。以下是我正在使用的代码,我添加了注释,希望这些变量提供一个值:
(function($) {
'use strict';
var A = {
/**
* Initialize the A object
*/
init: function() {
this.$map = this.renderMap();
this.markers = this.getMarkers();
this.renderMarkers();
},
renderMap: function() {
var url = 'http://a.tiles.mapbox.com/v3/delewis.map-i3eukewg.jsonp';
// Get metadata about the map from MapBox
wax.tilejson(url, function(tilejson) {
var map = new L.Map('map', {zoomControl: false});
var ma = new L.LatLng(42.2625, -71.8028);
map.setView(ma, 8);
// Add MapBox Streets as a base layer
map.addLayer(new wax.leaf.connector(tilejson));
return function() {
return map;
};
});
},
renderMarkers: function() {
var geojsonLayer = new L.GeoJSON(null, {
pointToLayer: function (latlng){
return new L.CircleMarker(latlng, {
radius: 8,
fillColor: "#ff7800",
color: "#000",
weight: 1,
opacity: 1,
fillOpacity: 0.8
});
}
});
geojsonLayer.addGeoJSON(this.markers); // this.markers is undefined
this.$map.addLayer(geojsonLayer); // this.$map is undefined
},
getMarkers: function() {
$.getJSON("/geojson/", function (data) {
return data;
});
}
};
/**
* A interactions
*/
$(document).ready(function() {
A.init()
});
})(jQuery.noConflict());
我花了一天的时间搜索,我想我在这里遗漏了一些基本的东西,但我不明白。无论是renderMap
,还是getMarkers
方法都不会返回任何值,因此它们的返回值是未定义的
看起来您正试图从ajax请求初始化这些字段,这不一定是个好主意
您可能应该做的是:
getMarkers: function(callback){
var result = this;
$.getJSON("url", function(jsonData){
result.markers = jsonData;
if(callback) callback()
});
},
当对象的字段变为可用时,将延迟初始化这些字段
NB:AJAX是异步的您不能依靠此回调快速设置成员,甚至永远都不能(它可能会失败)。
这意味着您需要更多地考虑您的设计,并尝试更多地使用回调
e、 g.如上所述修改getMarkers
和renderMap
函数,以获取存储数据后调用的回调,然后将init更改为:
init: function(){
var res = this;
var post_init_callback = function(){
if(res.$map != undefined && res.markers!=undefined){
//this will only run after both ajax calls are complete
res.renderMarkers();
}
};
this.getMarkers(post_init_callback);
this.renderMap(post_init_callback);
},
无论是renderMap
,还是getMarkers
方法都不会返回任何值,因此它们的返回值是未定义的
看起来您正试图从ajax请求初始化这些字段,这不一定是个好主意
您可能应该做的是:
getMarkers: function(callback){
var result = this;
$.getJSON("url", function(jsonData){
result.markers = jsonData;
if(callback) callback()
});
},
当对象的字段变为可用时,将延迟初始化这些字段
NB:AJAX是异步的您不能依靠此回调快速设置成员,甚至永远都不能(它可能会失败)。
这意味着您需要更多地考虑您的设计,并尝试更多地使用回调
e、 g.如上所述修改getMarkers
和renderMap
函数,以获取存储数据后调用的回调,然后将init更改为:
init: function(){
var res = this;
var post_init_callback = function(){
if(res.$map != undefined && res.markers!=undefined){
//this will only run after both ajax calls are complete
res.renderMarkers();
}
};
this.getMarkers(post_init_callback);
this.renderMap(post_init_callback);
},
这里的问题是在另一个函数中调用return。实际上,您所做的是将getMarkers
(最简单的示例)定义为:
在这一点上,getMarkers实际上并没有返回任何东西(因此未定义)就变得很明显了。renderMap函数也是如此。同样在这种情况下,“some_random_func”被定义为函数(data){return data;}
,但它返回到什么?事实上,some\u random\u func
是由jQuery本身调用的,而AFAIK jQuery根本不关心它的success函数的返回值。这里的问题是在另一个函数中调用return。实际上,您所做的是将getMarkers
(最简单的示例)定义为:
在这一点上,getMarkers实际上并没有返回任何东西(因此未定义)就变得很明显了。renderMap函数也是如此。同样在这种情况下,“some_random_func”被定义为函数(data){return data;}
,但它返回到什么?事实上,jQuery本身调用了some\u random\u func
,而AFAIK jQuery根本不关心它的success函数的返回值。因为您不能(假设不应该)从Ajax调用返回值。。。默认情况下,Ajax是异步的。如果可以直接返回值,为什么必须传递回调?请阅读。这部分是范围问题,但主要是时间问题。该函数不返回值。传递给$.getJSON
的回调确实执行,但该回调由(内部)$.getJSON
执行,因此它将值返回给$.getJSON
,而不是调用getMarkers
的函数。此外,当接收到响应时执行回调,此时getMarkers
已经完成(返回undefined
)。这里有成千上万个关于同一个问题的问题,肯定有成千上万个,很容易。有一天,我数了数几个小时内8个新的“异步东西不返回值”问题。假设每天有大约8个这样的帖子,那么到目前为止,在网站的生命周期内,这大约是30000个。@GGG,我没有意识到这两个场景都是ajax调用。我这方面愚蠢吗?是的,这让我找错了地方。@MarkLewis您将回调传递给名称中带有“json”的函数这一事实应该是一个很大的提示,表明您正在调用的函数是同步的,而您从回调返回内容这一事实应该是一个危险信号。因为您不能(假设不应该)从Ajax调用返回值。。。默认情况下,Ajax是异步的。如果可以直接返回值,为什么必须传递回调?请阅读。这部分是范围问题,但主要是时间问题。该函数不返回值。传递给$.getJSON
的回调确实执行,但该回调由(内部)$.getJSON
执行,因此它将值返回给$.getJSON
,而不是调用getMarkers
的函数。此外,当接收到响应时执行回调,此时getMarkers
已经完成(返回undefined
)。这里有成千上万个关于同一个问题的问题,肯定有成千上万个,很容易。有一天,我数了数几个小时内8个新的“异步东西不返回值”问题。假设每天有大约8个这样的帖子,那么到目前为止,在网站的生命周期内,这大约是30000个。@GGG,我没有意识到这两个场景都是ajax调用。我这方面愚蠢吗?是的,这让我找错了地方。@MarkLewis您向名称中带有“json”的函数传递回调的事实应该是一个相当大的问题