window vs this作为IIFE中的参数

时间:2015-05-20 17:03:00

标签: javascript iife

我看到这个IIFE"模板"在Javasript图书馆中有很多。



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




并想问:在什么情况下窗口对象未定义?在这种情况下,这个引用了什么?

2 个答案:

答案 0 :(得分:1)

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

此处显示了一个示例:https://github.com/tbranyen/use-amd/issues/4

答案 1 :(得分:0)

看看你的问题,你必须在服务器上运行你的javascript代码,即node.js或其他任何分支时讨论这个案例。

在这种情况下,既没有定义窗口对象也没有定义文档对象,因为节点上不存在这些对象,因此您的代码将引发参考错误。删除对文档对象的引用并测试此变量

(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));

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