gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 19:11:53 27 4
gpt4 key购买 nike

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

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

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

最佳答案

您可以执行以下操作:

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);

这样做的问题是,您不仅会使用公共(public) API 污染全局范围,还会污染您可能存储在本地闭包中的任何内容。我觉得这太沉重了。

如果您的库使用类似揭示模块模式的内容并且仅公开函数,那么我认为第一个非常简单。但正如其他人所说,这可能并不明智。最多,我会将此作为用户的一个选项提供,但会警告不要这样做。

关于javascript - installLibrary,将所有函数移动到全局命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13611985/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com