Javascript 对象字面范围问题?

标签 javascript jquery scope

我很难理解为什么 this.$mapthis.markers 未定义。这是我正在使用的代码,并且我在我希望这些变量提供值的地方添加了注释:

(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());

我花了一天的大部分时间进行搜索,我认为我在这里遗漏了一些基本的东西,但我不明白。

最佳答案

renderMapgetMarkers 方法都不会返回任何值,因此它们的返回值是未定义

看起来您正在尝试从 ajax 请求初始化这些字段,这不一定是个好主意。

你可能应该做的是:

getMarkers: function(callback){
    var result = this;
    $.getJSON("url", function(jsonData){ 
        result.markers = jsonData; 
        if(callback) callback()
     });
},

当对象的字段可用时,它将延迟初始化它们。

注意:AJAX 是异步,您不能依赖此回调来快速设置成员,甚至永远不能(它可能会失败)。 这表明您需要更多地考虑您的设计,并尝试更多地使用回调。

例如如上所述修改 getMarkersrenderMap 函数以获取存储数据后调用的回调,然后将 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);
},

关于Javascript 对象字面范围问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10526384/

相关文章:

javascript - 处于 Bootstrap 模式时 Ckeditor 错误

javascript - 如何为 chrome 扩展添加拖动功能?

javascript - Bootstrap 导航栏不显示 CSS

javascript - 调用 onclick 函数时显示 2 个及更多字符

python - 为什么这个对非本地范围的变量引用不会解析?

javascript - Ajax表单数据未保存在数据库中

javascript - Eslint glob (**) 没有递归地考虑所有目录

javascript - 如何设置动画让元素绕着圆圈移动?

python - 从嵌套函数中按父函数中定义的名称访问变量

c++ - 处理大量变量声明