【问题标题】:Difference between IIFE and callIIFE 和 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 的引用的一种混淆方式。

标签: javascript namespaces scope


【解决方案1】:
(function(){

}).call(this);

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

(function(){

})();

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

演示:Fiddle

【讨论】:

  • 为什么大部分编译好的javascript使用call而不是iifee?如果我创建一个带有 call(this) 的函数,这将等于 window(全局对象),所以它有点相同吗?
  • @JonathandeM。我认为这是一个品味问题,而不是任何其他差异
  • 请注意,在严格模式下,第二个示例中的 this 将是未定义的。
  • 但是在某些浏览器(旧 IE)中通过 Function.call/Function.apply 调用函数可能(而且确实)慢一点。我认为,这是由于调用了附加功能(命名调用)。
猜你喜欢
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 2012-11-07
  • 2011-05-22
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
相关资源
最近更新 更多