【发布时间】:2025-12-02 15:05:01
【问题描述】:
我一直在练习具有适当名称间距的 JavaScript 模块模式。所以基本上我声明了命名空间,每个命名空间都封装了某些模块。这是我到目前为止所写的。代码已正确注释。
// namespace has been defined somewhere not to worry that it will be undefined
if (NAMESPACE == null || typeof (NAMESPACE) == 'undefined') {
NAMESPACE = {};
var id = function (id) {
var _all_ids = {};
var persona = {};
var _id = id; // _id is a local variable that stores the argument
var getId = function () { //this function returns the local private variable
return _id;
}
persona.getId = getId;
var _closed = false;
var close = function () {
delete _all_ids[getId()];
this._closed = true;
}
persona.close = close;
return persona; // persona is an object that has two properties `getId` and `close`. Both these are functiona
}
NAMESPACE['id'] = id; // so basically this will become NAMESPACE.id.getId or NAMESPACE.id.close
}
我已经对代码进行了完整的注释,任何人都可以理解。它声明一个简单的命名空间,然后在其中添加一个模块。该模块当然是使用封装。
我的一位导师建议此代码具有基本的缺陷标准或其他。尽管代码运行良好,但我无法弄清楚这一点。
标准是否足够好?还是我做错了?
【问题讨论】:
-
这是完整的模块吗?通常一个模块被封装在一个生命周期中
-
@daniel_L 是的,这是完整的模块——并且还声明了立即函数,但我没有将它包含在此处的代码中。它只是一个关于我如何尝试创建命名空间的示例。
-
您的设置
NAMESPACE['id'] = id。这将使您的命名空间具有var id后面的功能,而不是模块接口,因为您还没有运行该功能。最好返回作为模块接口的角色对象,并让 NAMESPACE 决定模块的去向。这样您就可以重用模块,而无需依赖于您的命名空间将所有模块都置于其*范围内。 -
@shilly 很有趣!但是如果你注意到我最后返回了
persona object。id返回角色对象,所以无论如何我基本上都会返回它。 -
@Talha,仅当您转到
NAMESPACE['id'] = id();时,您将 namespace.id 设置为函数 ID,而不是函数返回的对象。
标签: javascript namespaces module-pattern code-standards