【问题标题】:IIFE and window object?IIFE 和窗口对象?
【发布时间】: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 吗?

标签: javascript jquery


【解决方案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 个简单问题)
猜你喜欢
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
  • 2011-10-04
  • 2014-08-11
相关资源
最近更新 更多