2014-02-20 255 views
2

我想在模块模式中使用javascript创建一些隔离。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

你忘了申报 “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"; 

在你的代码顶部的习惯。这在这种情况下会导致错误。

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