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:有任何区别吗?如果是这样,我应该什么时候使用它们?
问题 2:this
在 IIFE
内 是 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 和窗口对象?的主要内容,如果未能解决你的问题,请参考以下文章
272 函数的理解和使用:回调函数,匿名函数自调用IIFE,**函数中的this**
34JavaScript面向对象(内置构造函数&相关方法|属性|运算符&继承&面向对象)