像Underscore.js和LoDash.js这样的JS库通常通过全局对象_提供函数。
_.map(...);
_.filter(...);这些基本函数是Python中的全局函数和标准库的一部分:
map(...)
filter(...)如果我把图书馆功能提升到全局功能..。
window.map = _.map;
window.filter = _.filter;
map(...);
filter(...);..。除了全球名称空间污染之外,还会有哪些不利因素?
我一定要预料到任何性能问题吗?
它会导致某些浏览器中的错误吗?(例如,如果内置的JS函数被库函数覆盖,而库函数又依赖于本机函数)
链子还能用吗?
发布于 2014-11-02 18:43:48
假设像这样的图书馆,
_ = (function(){
lib = {};
lib.function1 = function(){
//code
};
lib.function2 = function(){
this.function1();
};
//more code
return lib;
})();如果你用,
window.function2 = _.function2;
function2();库在function2中使用"this“操作符。您的方式在这里更改了function2的范围。function2()调用将给出一个错误:"function1未定义“。
发布于 2014-11-02 18:12:44
有多种不利因素,但性能不太可能是其中之一。
如果两个库都有一个map()函数并且行为稍有不同怎么办?如果他们都将他们的map()放在全局空间中,您将无法访问其中的一个。而且您可能无法很容易地知道您实际想要的map()已被覆盖。
顺便说一句,map()和filter()是最新版本JS实现的一部分,但即使在那里,它们也是使用它们的对象的原型的一部分。所以你有Array.prototype.map()和Array.prototype.filter()。
发布于 2014-11-02 18:42:31
下面是一些避免让map和filter这样的东西成为全局变量的原因:
map()这个符号是从哪里来的。这是内置的吗?它是本地定义的吗?它是由某个图书馆定义的吗?要知道gutils.map()来自何处(来自gutils模块)要容易得多。与将事物分解为定义良好的模块相比,大量的全局任何东西都更不容易维护。.map()和.filter()是数组对象上的方法,而不是泛型全局)。现在,将非标准方法添加到现有的内建对象(也是为了命名冲突原因)被认为是不好的做法,但鼓励添加实现标准行为的填充。有关其他信息,请参阅这些参考资料:
至于性能的主题,它不应该是您的第一关注事项,而且在大多数代码中甚至可能不是一个相关的关注点。从健壮的、可维护的编码策略开始,然后只优化性能关键的小代码段比以性能为名牺牲健壮性要重要得多。
在性能至关重要的任何紧循环中,始终可以将任何函数赋值给局部变量以略微提高性能,这将比模块引用或全局引用(因为局部变量在全局变量之前被解析)更快。
因此,如果模块中有gUtils.map(),并且希望在特定函数中最大限度地提高性能,则可以这样做:
function x() {
var map = gUtils.map;
for (var i = 0; i < someBigNumber; i++) {
map(...);
}
}https://stackoverflow.com/questions/26702562
复制相似问题