JS Revealing Module Pattern范围/参考

时间:2014-04-11 07:32:52

标签: javascript reference leaflet mapbox

我认为我对JS的范围或引用有点误解。

我使用Leaflet发起新的地图对象。我的代码是这样的:

var revealing = (function() {
    var mapEl = "#map";
    var mapName = "map";
    var mapboxMap = '----';
    var map;


    var init = function() {
        map = L.mapbox.map(mapName, mapboxMap);
        map.setView([40, -100], 5);
    }

    return {
        "init": init
    }

}());

如果我参考' map'在init函数中,我得到了我想要的东西。但是在我引用map的任何其他地方(在函数内或其他地方通过'揭示'对象,我得到了leafleft(L.mapbox ...)创建的html对象的引用,而不是实例化的对象我进入init()。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您没有显示遇到问题的代码(例如,访问map而没有得到您期望的内容),但我怀疑问题不是范围,而是时间

在您的大型匿名函数中,map将解析为您在该函数中声明的map变量。但是该变量的值为undefined,直到init将其设置为某个值。此时,它具有init赋予它的值。

此示例中的更多内容:

var revealing = (function() {
    var mapEl = "#map";
    var mapName = "map";
    var mapboxMap = '----';
    var map;


    var init = function() {
        map = L.mapbox.map(mapName, mapboxMap);
        map.setView([40, -100], 5);
    }

    var useMap = function() {
        console.log(map); // <============== 1 - See 3 and 4 below
    };

    console.log(map);     // <============== 2 - Shows "undefined"

    return {
        "init": init,
        "useMap": useMap
    }

}());
revealing.useMap();       // <============== 3 - Shows "undefined"
revealing.init();
revealing.useMap();       // <============== 4 - Shows the map created in `init`