2017-03-13 73 views
0

我遇到了一个片段,我怀疑它可以用直接的方式编写。可能有人请告诉我是什么空两个片段之间的区别:使用函数的私有函数的引用创建对象

var printer = (function() { 
    var printerInstance; 
    var obj = { 
    f1: function() {}, 
    f2: function() {} 
    }; 
    return { 
    getInstance: function() { 
     if(!printerInstance) { 
     printerInstance = obj; 
     } 
     return printerInstance; 
    } 
    }; 
})(); 

而且

var printer = (function() { 
    var printerInstance; 
    function create() { 
     function f1() {} 
     function f2() {} 
     return { 
      f1: f1, 
      f2: f2 
     } 
    } 

    return { 
     getInstance: function() { 
     if(!printerInstance) { 
      printerInstance = create(); 
     } 
     return printerInstance; 
     } 
    }; 
})(); 

我不明白为什么对象在函数内部在第二个例子中创建。请澄清。

+1

在这两个示例中,即时函数应用程序都将创建一个新的作用域,以便'printerInstance','obj'和'create'不会泄漏到周围的作用域中。 – Sylwester

回答

1

那么,第一个对所有调用都有一个名为obj的对象,第二个为每个调用创建一个新对象。

因此,例如说,它是:

var obj = { 
    var counter = 0; 
    f1: function() { return counter++; }, 
    f2: function() {} 
}; 

,第二个是:

function create() { 
    var counter = 0; 
    function f1() { return counter++; } 
    function f2() {} 
    return { 
    f1: f1, 
    f2: f2 
    } 
} 

在第一情况下,存在与一个counter一个对象,该对象将被所有被引用getInstance invocations(其中printerInstance等于null)。所以这更像是Singleton

在第二种情况下,getInstance的每个调用都将拥有自己的计数器并独立计数。

相关问题