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 的区别的主要内容,如果未能解决你的问题,请参考以下文章