UMD模式中的全局上下文

时间:2014-05-23 16:49:04

标签: javascript node.js console global amd

我正在编写一个不可知的日志记录机制,它在浏览器和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;
});

我偶然发现了两个无法解释的差异:

  1. 正如所料,对于浏览器案例,变量'global'具有window的值。但是,Nodejs的“global”只是一个简单的对象,而不是Nodejs的全局变量。这是有意的吗?可以使用'.call'来执行模块,以保留浏览器和Nodejs的相应上下文。由于这是一种常见的UMD模式,我怀疑在Nodejs中修改全局变量是不是一个坏主意,这让我接下来的问题。

  2. 在浏览器中,可以通过将我的自定义对象传递给控制台属性来覆盖全局控制台功能。通过恢复对原始对象的引用,可以恢复旧行为。这在Nodejs中是不可能的,当我尝试将我自己的logger对象传递给global.console时它会失败。奇怪的是,我在网上找不到任何有用的文档...

  3. 希望得到一些澄清!

1 个答案:

答案 0 :(得分:2)

<强>更新

显然,以下内容可能无法在Chrome中的所有情况下使用。请参阅this answer的评论。

原始回答

我在代码中使用以下代替this来获取全局对象。在ECMAScript 3和5环境中似乎是不漏水的:

(function(f) { return f("return this")(); })(Function)

这是为了安抚不喜欢使用evalFunction构造函数的JSLint等短语。如果你不关心这些事情(对你而言),你可以使用以下更简单的代码:

Function("return this")()

背景: