IIFE 和 call 的区别

Posted

技术标签:

【中文标题】IIFE 和 call 的区别【英文标题】:Difference between IIFE and call 【发布时间】:2013-07-10 12:15:32 【问题描述】:

有没有区别:

(function()

).call(this);

(function()

)();

var MODULE = ;
(function()
    this.hello = 'world'
).call(MODULE);

var MODULE = ;
(function(m)
    m.hello = 'world'
)(MODULE);

我经常在编译的 javascript 中看到第一种情况。他们都会创建一个范围并做好命名空间的工作。

有什么不同还是只是口味问题。

编辑: 为什么编译好的 javascript 会使用 IIFE 调用?

【问题讨论】:

“编译好的 javascript”是什么意思? 类似咖啡或钛合金 这真的取决于this 在调用时是什么;在大多数情况下不会有任何区别,因为所有代码都由它包装。 请注意,函数的 this 关键字与作用域无关,它总是在当前执行上下文中解析,而不是在作用域链上。无论如何,我会使用第二个版本,第一个只是传递对 MODULE 的引用的一种混淆方式。 【参考方案1】:
(function()

).call(this);

调用匿名函数,其中函数内部的this 将指向调用时this 引用的对象。

(function()

)();

调用匿名函数,其中函数内部的this 将指向全局对象(或在严格模式下未定义)

演示:Fiddle

【讨论】:

为什么大部分编译好的javascript使用call而不是iifee?如果我创建一个带有 call(this) 的函数,这将等于 window(全局对象),所以它有点相同吗? @JonathandeM。我认为这是一个品味问题,而不是任何其他差异 请注意,在严格模式下,第二个示例中的 this 将是未定义的。 但是在某些浏览器(旧 IE)中通过 Function.call/Function.apply 调用函数可能(而且确实)慢一点。我认为,这是由于调用了附加功能(命名调用)。 如果有人对表演感兴趣:jsperf.com/iife-vs-function-with-call-named-and-unnamed

以上是关于IIFE 和 call 的区别的主要内容,如果未能解决你的问题,请参考以下文章

IIFE 和窗口对象?

Javascript中call和apply的区别与详解

JS中 call和apply的区别和作用

js中call和apply的区别

Js中call和apply的区别和用法是啥?

js中callback.call()和callback()的区别