我之前遇到过 JavaScript 模块化下数据隐藏的问题。请参阅以下链接:
模块模式 - 如何将一个模块的代码拆分成不同的 js 文件?
为了说明问题,请参见下面的示例。我的目标是将我的长js文件分成2个文件,但是有些函数需要访问一些私有变量:
first.js:
(function(context) {
var parentPrivate = 'parentPrivate';
})(window.myGlobalNamespace);
second.js:
(function(context) {
this.childFunction = console.log('trying to access parent private field: ' + parentPriavte);
}(window.myGlobalNamespace.subNamspace);
现在这行不通,因为孩子无权访问父母。一种解决方案是parentPrivate
公开可见,但在我的情况下这是不可接受的。
引用@Louis 的话,他回答了之前的一个问题:
“我们不能有一个儿童可以访问但外部公众无法访问的字段(即受保护)。有什么方法可以实现吗?”
如果您想要模块化(即您希望子项与父项分开编码),我认为这在 JavaScript 中是不可能的。可以让孩子和父母在同一个闭包中操作,但这不会是模块化的。无论有没有 RequireJS 都是如此。
问题是父母和孩子不在同一个闭包内。因此我在想,创建一个将文件放入同一个闭包的库是否有意义?
就像是:
concatenator.putIntoOneClosure(["public/js/first.js", "public/js/second.js"]);
当然,我们可以接受更多参数来指定命名空间等。请注意,这与我们从 RequireJS 获得的功能不同。RequireJS实现了模块化,而这个concatenator专注于模块化条件下的数据隐藏。
那么上述任何一个有意义吗?还是我错过了一些重要的点?欢迎任何想法。