IIFE 和窗口对象?

Posted

技术标签:

【中文标题】IIFE 和窗口对象?【英文标题】:IIFE and window object? 【发布时间】:2014-04-12 10:03:54 【问题描述】:

IIFE 需要访问非覆盖的window 对象 - 可以看作:

类似(jQuery 示例):

$(function (global) 
  // do something with global
)( window );

但有时我也看到这个 (underscore.js):

(function() 
  var global= this;
  // do something with global
).call(this);

问题 1:有任何区别吗?如果是这样,我应该什么时候使用它们?

问题 2thisIIFE window。为什么要“发送”window/call(this)? (jQuery 没有使用严格模式恕我直言)

注意

看起来 jQuery(自 1.11.0)也采用了这种模式:

(function (global, factory)

   //....

(typeof window !== "undefined" ? window : this, function (window, noGlobal)

   //...
);

【问题讨论】:

在某些 JS 环境中可能没有 window 变量……而 this works even in strict mode @Bergi 所以他们可以这样做:$(function (global) // do something with global )( this );....no ? @Bergi 你能帮我找到The DOCS 在哪里说IIFE 中的上下文是全局对象吗? (我找不到) 不一定在 IIFE 内部(通过普通调用逻辑它是 determined),但 global this(作为参数传递给 .call())是 always 全局对象。 @Bergi 你是在告诉我当我做f() 它实际上运行f.call 吗? 【参考方案1】:
(function() 
  var win = this;
  // do something with win
  ).call(this);

Underscore 是 javascript 库而不是 DOM 库,因此不应在任何地方使用 window,因为 javascript 不是 DOM 而 window 是 DOM api

通过这种方法,下划线不会绑定到 DOM。尝试在 nodejs 或 rhino 中调用 window 是行不通的,也没有任何意义。

编辑:

call 将函数的上下文设置为 this(global 或 window) ,因此无需将任何内容作为参数传递。

【讨论】:

那么,为什么它仍然使用this 好吧,因为这是指向范围的有效 javascript。如果您在控制台中键入它,它将返回窗口。 我在问这两个之间的区别:-)。例如 - 为什么下划线没有 :(function (root) // ... )( this); 代替? (为了设置上下文) $ 是 jquery 的快捷方式,为什么要下划线使用它? 我知道调用设置上下文也适用。但在 IIFE 内部 - this 已经引用了全局对象。还 - 选择应用/呼叫 VS 发送 this 有什么理由吗? (这实际上是我的 2 个简单问题)

以上是关于IIFE 和窗口对象?的主要内容,如果未能解决你的问题,请参考以下文章

善用 IIFE 以封装 BOM对象提供的方法

Javascript IIFE,对象[复制]

272 函数的理解和使用:回调函数,匿名函数自调用IIFE,**函数中的this**

34JavaScript面向对象(内置构造函数&相关方法|属性|运算符&继承&面向对象)

JavaScript学习总结——闭包IIFEapply函数与对象

IIFE的形式原理和常见写法