如何正确使用Immediately-Invoked Function Expression(IIFE)来声明类?

时间:2015-04-14 15:24:11

标签: javascript scope iife

据我所知,有许多不同的方式来申报IIFE:
http://benalman.com/news/2010/11/immediately-invoked-function-expression/

但我无法理解的是,在同一个IIFE中有时会定义多个类,有时候它们在每个类中都是分开的。

示例:

这...

(function(scope) {
  var ClassA = scope.ClassA = function(params) {
    this.params = params;
  }

  var ClassB = scope.ClassB = function(params) {
    this.params = params;
  }
})(someNamespace || window);

VS。也就是说...

(function(scope) {
    var ClassA = scope.ClassA = function(params) {
        this.params = params;
    }
})(someNamespace || window);

(function(scope) {
    var ClassB = scope.ClassB = function(params) {
        this.params = params;
    }
})(someNamespace || window);

将每个班级分隔成他们自己的IIFE有什么好处吗?

2 个答案:

答案 0 :(得分:3)

使用IIFE的目的是阻止一段代码使用的变量泄漏到可能与另一段代码使用的同名变量混淆的地方。

如果这两个函数应该共享变量,那么将它们放在同一个IIFE中是个好主意。如果没有,那么它们应该分开以避免命名冲突并向维护者显示它们是分开的。

答案 1 :(得分:1)

共享IIFE有轻微的性能优势。 我把你的两个例子放到了jsperf中并进行了比较,共享的IIFE运行稍微更快......但是除非你用这种方式声明成千上万的类,否则性能提升完全可以忽略不计。

http://jsperf.com/iife-performance-for-class

这是一个不同的测试,以稍微不同的方式比较IIFE的性能: http://jsperf.com/iife-performance

我更喜欢将每个类放在自己的文件中,以便在编辑过程中更容易找到每个类,这将导致每个类获得自己的IIFE。