我正在编写一个不可知的日志记录机制,它可以在浏览器和 nodejs 中运行(例如,nodejs 中缺少 console.debug)。
// UMD with no dependencies
(function(global, factory) {
if (typeof module === 'object') {
module.exports = factory();
// GLOBAL IS NOT WHAT I WOULD EXPECT, YOU?
global.console = factory();
} else if (typeof define === 'function' && define.amd) {
define(factory);
} else {
global.console = factory();
}
})(this, function() {
function logger() {};
return logger;
});
我偶然发现了 2 个我无法解释的差异:
正如预期的那样,对于浏览器,变量“global”的值为 window。但是,对于 Nodejs,'global' 只是一个简单的对象,而不是 Nodejs 的全局变量。这是故意的吗?可以使用“.call”执行模块以保留浏览器和 Nodejs 的相应上下文。由于这是一种普遍接受的 UMD 模式,我怀疑在 Nodejs 中修改全局变量是否是个坏主意,这让我想到了下一个问题。
在浏览器中,可以通过将我的自定义对象传递给控制台属性来覆盖全局控制台功能。可以通过恢复对原始对象的引用来恢复旧行为。这在 Nodejs 中是不可能的,当我试图将我自己的记录器对象传递给 global.console 时它失败了。奇怪的是,我在网上没有找到任何有用的文档...
希望得到一些澄清!
最佳答案
更新
显然,以下内容可能无法在 Chrome 中的所有情况下工作。查看对 this answer 的评论.
原始答案
我在我的代码中使用以下而不是 this
来获取全局对象。它在 ECMAScript 3 和 5 环境中似乎无懈可击:
(function(f) { return f("return this")(); })(Function)
为了安抚不喜欢使用 eval
和 Function
构造函数的 linter,例如 JSLint,这有点间接。如果您不关心这些事情(对您来说是的),您可以改用以下更简单的代码:
Function("return this")()
背景:
关于javascript - UMD 模式中的全局上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23834572/