具有名称空间的JavaScript对象中的本地函数
我想创建一个名称空间来组织我所有的JavaScript。我看不到一种方法,使用下面的代码示例来创建一个本地函数,这样它就只能从这个对象中调用具有名称空间的JavaScript对象中的本地函数,javascript,Javascript,我想创建一个名称空间来组织我所有的JavaScript。我看不到一种方法,使用下面的代码示例来创建一个本地函数,这样它就只能从这个对象中调用 window.JD = window.JD || {}; JD.Guid = { newGuid : function() { return JD.Guid.s4(); // Would like this to be this.s4(); }, s4 : function() { return
window.JD = window.JD || {};
JD.Guid = {
newGuid : function() {
return JD.Guid.s4(); // Would like this to be this.s4();
},
s4 : function() {
return Math.floor((1 + Math.random()) * 0x10000);
}
}
我尝试过使用JD.Guid=function(){…}
,但也不起作用。控制台告诉我函数未定义
我希望能够从我的站点中的任何位置调用
JD.Guid.newGuid()
。我不确定是否在跟踪。但您可以通过在函数中创建一个将代码包装的上下文来创建在全局命名空间中不可访问的本地函数:
(function() {
window.JD = window.JD || {};
function s4() {
return Math.floor((1 + Math.random()) * 0x10000);
}
JD.Guid = {
newGuid: function() {
return s4();
}
}
})();
我通常会这样做:
var JD = (function(GLOBAL_JD){
if(GLOBAL_JD === undefined) {
var jd = {
GUID: {
newGuid: newGuid
}
};
return jd;
}
function newGuid() {
return s4(); // Would like this to be this.s4();
}
function s4() {
return Math.floor((1 + Math.random()) * 0x10000);
}
})(JD);
console.log(JD.GUID.newGuid());
我想您是在询问
模块
设计模式,在这种情况下,您的代码必须如下所示:
window.JD = window.JD || {};
JD.Guid = (function () {
// This function is private,
// you can re-use it only from public accessible method.
var privateMethod = function() {
return 'private';
};
return {
newGuid : function() {
return JD.Guid.s4();
},
newGuidThroughtThis : function() {
return this.s4();
},
privateMethod: function() {
return privateMethod();
},
s4 : function() {
return Math.floor((1 + Math.random()) * 0x10000);
}
}
})();
现在,您可以重新使用模块并执行以下操作:
console.log(JD.Guid.s4());
console.log(JD.Guid.newGuid());
console.log(JD.Guid.newGuidThroughtThis());
作为输出,您将得到如下结果:118723Try:console.log(JD.Guid.newGuid());您想如何访问您的功能?谢谢@johnyaw。问题已更新。如果您的本地作用域(因为您希望从任何位置调用)具有
JD
,请尝试调用window.JD.Guid.newGuid()
,否则,我看不出有任何错误,您可以从您站点的任何位置调用JD.Guid.newGuid()
,(如果当前作用域或父层次结构作用域中除窗口的作用域外没有“JD”)谢谢,这正是我正在寻找的,发现这个链接可能会在将来帮助其他人很酷!是的,链接很有用。是的,它确实有用,尽管另一个答案谈到了模块
设计模式,这正是我所追求的。尽管你的答案与问题相符。