installLibrary,将所有函数移动到全局命名空间

时间:2012-11-28 18:30:33

标签: javascript

我正在编写一个库,并且我使用“lib.someFunction();”调用所有函数。或“lib.someVariable;”。我知道我不应该污染全局命名空间,但我想给我的库用户提供这个选项。我听说有些库有一个“选项”,比如“installLibrary();”将类中的所有函数和变量移动到全局名称空间。

这样,只有用户更喜欢这样才能调用“someVariable”。或“someFunction();”直接

我的问题是如何编写这样的函数。有什么想法吗?

2 个答案:

答案 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污染全局范围,还要使用在本地闭包中存储的任何内容。这让我觉得太沉重了。

如果您的库使用类似于揭示模块模式的东西并仅公开函数,那么我认为第一个非常简单。但正如其他人所说,这可能并不明智。在最多的情况下,我会将此作为用户的选项,但警告它。