Javascript模块模式隔离

时间:2014-02-20 17:45:15

标签: javascript module-pattern

我正在尝试使用模块模式在javascript中创建一些隔离。

但是当我运行此代码时:

var mymap = {};

mymap['230'] = (function () {
    privatePageLoad = function(nid, page){
        console.log('PAGE LOAD from 230: '+nid);
    }

    function handleDocummentAdded() {
        console.log("New Document in 230!");
        privatePageLoad(230, 0);
    };

    return {
        newDocument: handleDocummentAdded
    }
})();

mymap['318'] = (function () {
    privatePageLoad = function(nid, page){
        console.log('PAGE LOAD from 318: '+nid);
    }

    function handleDocummentAdded() {
        console.log("New Document in 318!");
        privatePageLoad(318, 0);
    };

    return {
        newDocument: handleDocummentAdded
    }
})();

mymap['230'].newDocument();
mymap['318'].newDocument();

我得到以下结果:

New Document in 230! (index):29
PAGE LOAD from 318: 230 (index):40
New Document in 318! (index):44
PAGE LOAD from 318: 318 

但我在期待:

New Document in 230! (index):29
PAGE LOAD from 230: 230 (index):40
New Document in 318! (index):44
PAGE LOAD from 318: 318 

调用的私有方法始终是最后添加到地图的... 我做错了什么?

这是一个jsfiddle与它http://jsfiddle.net/jpedro/4xdTA/

2 个答案:

答案 0 :(得分:4)

privatePageLoad根本不是私密的。添加var,否则privatePageLoad将是全局的(即全局对象的属性(窗口,模块,等等))

将您的代码更改为:

var mymap = {};

mymap['230'] = (function () {
    var privatePageLoad = function(nid, page){
        console.log('PAGE LOAD from 230: '+nid);
    }

    function handleDocummentAdded() {
        console.log("New Document in 230!");
        privatePageLoad(230, 0);
    };

    return {
        newDocument: handleDocummentAdded
    }
})();

mymap['318'] = (function () {
    var privatePageLoad = function(nid, page){
        console.log('PAGE LOAD from 318: '+nid);
    }

    function handleDocummentAdded() {
        console.log("New Document in 318!");
        privatePageLoad(318, 0);
    };

    return {
        newDocument: handleDocummentAdded
    }
})();

答案 1 :(得分:2)

你忘了声明" privatePageLoad"与var。因此,它是一个全局变量。

您还可以使用函数声明语句:

mymap['230'] = (function () {
    function privatePageLoad(nid, page){
        console.log('PAGE LOAD from 230: '+nid);
    }

    function handleDocummentAdded() {
        console.log("New Document in 230!");
        privatePageLoad(230, 0);
    };

    return {
        newDocument: handleDocummentAdded
    }
})();

另外,养成放

的习惯
"use strict";

位于代码顶部。在这种情况下,这会导致错误。