我正在编写一个库,并且我使用“lib.someFunction();”调用所有函数。或“lib.someVariable;”。我知道我不应该污染全局命名空间,但我想给我的库用户提供这个选项。我听说有些库有一个“选项”,比如“installLibrary();”将类中的所有函数和变量移动到全局名称空间。
这样,只有用户更喜欢这样才能调用“someVariable”。或“someFunction();”直接
我的问题是如何编写这样的函数。有什么想法吗?
答案 0 :(得分:1)
除了不使用您的图书馆污染全球空间的明显原因之外,我相信您可以做以下事情。
注意:我写这篇文章是为了查看我们是否在浏览器或节点内。您应该能够在浏览器中引用“window”,在节点中引用“global”作为全局命名空间。
var scope = (typeof window !== 'undefined' ? window : global);
scope.someVariable = true;
scope.someFunction = function() { };
// Essentially, this is the same as:
window.someFunction = function() { };
// or
global.someFunction = function() { };
答案 1 :(得分:1)
您可以执行以下操作:
function Library() {
this.var = 5;
this.otherVar = 4;
this.cool = function(x) {
return x + this.otherVar;
}
}
var library = new Library();
(function (lib, context) {
for (var prop in lib) {
if (lib.hasOwnProperty(prop) && prop) {
if (typeof lib[prop] == "function") {
context[prop] = function() {
return lib[prop].apply(lib, arguments);
}
} else {
context[prop] = lib[prop];
}
}
}
}(library, this));
但要注意在这里使用除功能之外的任何东西。如果您这样做并尝试调整全局/窗口命名空间上的参数,它们将不会被带回您的库函数,并且可能无法获得您想要的行为。例如:
library.cool(3); // 7
cool(3); // 7
otherVar = 10;
library.cool(3); // 7
cool(3); // 7 Still?
library.otherVar = 10;
library.cool(3); // 13
cool(3); // 13 Finally!
没有此限制的替代方法是将库构造函数应用于全局/窗口对象:
Library.call(this);
问题在于,您不仅要使用公共API污染全局范围,还要使用在本地闭包中存储的任何内容。这让我觉得太沉重了。
如果您的库使用类似于揭示模块模式的东西并仅公开函数,那么我认为第一个非常简单。但正如其他人所说,这可能并不明智。在最多的情况下,我会将此作为用户的选项,但警告它。