window 与此作为 IIFE 中的参数

window vs this as parameter in IIFE

我在 Javasript 库中经常看到这个 IIFE "template"。

(function(window, document) {
  // code
}(typeof window !== "undefined" ? window : this, document));

并且想问:在什么情况下 window 对象是未定义的?在那种情况下,this 指的是什么?

当脚本在服务器端为 运行 时,window 可能未定义,例如,当使用 Node.js.

示例如下:https://github.com/tbranyen/use-amd/issues/4

看看你的问题,你一定是在谈论当你 运行 服务器上的 javascript 代码时的情况,即 node.js 或它的任何其他分支。

在这种情况下,window 对象或文档对象均未定义,因为节点上存在 none 个对象,因此您的代码将抛出引用错误。删除对文档对象的引用并测试 this 变量

(function(window) {
    console.log(window);
    console.log(typeof window);
    console.log(Object.prototype.toString(window));
}(typeof window !== "undefined" ? window : this));

输出将是

{}
object
[object Object]

这是一个空对象,它是对 module.exports 对象的引用。这很容易测试。

module.exports.test = function () {
    console.log('a');
};

(function(window) {
    window.test();
}(typeof window !== "undefined" ? window : this));

会在控制台输出一个。检查 this SO question 以了解有关 node.js 中 this 对象的值的更多信息。