异步库中`root = ...`代码的目的是什么?

时间:2015-06-04 11:02:47

标签: javascript

Async library中有这段代码:

if (typeof window == 'object' && this === window) {
    root = window;
}
else if (typeof global == 'object' && this === global) {
    root = global;
}
else {
    root = this;
}

这些代码有什么理由吗?为什么作者不只是使用root = this

第一个条件仅在this === window时有效,因此root = windowroot = this应相同。第二种情况也是如此,root = global应该等同于root = this

我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:7)

它不仅是多余的,而且似乎也是错误的。

就在你的片段之前,就是这样:

// global on the server, window in the browser
var root, previous_async;

因此,目标是将root分配给全局对象。

这样的库应该被编码为在严格模式下工作(不仅在严格模式下,它至少应该是兼容的)。在严格模式下,IIFE执行的上下文为undefined。此代码始终无法在严格模式下在节点和浏览器中找到根对象。

请注意,有可靠的方法来查找根对象。标准的是indirect call

var root = (1,eval)('this');