我正在尝试使用模块模式在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/
答案 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";
位于代码顶部。在这种情况下,这会导致错误。