2016-09-22 59 views
0

我在JS初學者,想了解單身的作品,閱讀很多關於這麼多的單例模式後,我的結論是下面的單例模式會工作,爲什麼我的單身人士不會工作?

var singletonIns = (function() { 
 
    var instance; 
 
    function init() { 
 
    var _pvtVar = 123; 
 
    var pubVar = 111; 
 
    var logPvt = function() { 
 
     console.log(_pvtVar); 
 
    }; 
 
    
 
    return { 
 
     pubVar : pubVar, 
 
     logPvt : logPvt 
 
    }; 
 
    } 
 
    return { 
 
    getInstance : function() { 
 
     if (!instance) { 
 
     instance = init(); 
 
     } else { 
 
     return instance; 
 
     } 
 
    } 
 
    }; 
 
})();

它不會在運行時拋出任何錯誤

但是,當我運行此代碼var abc = singletonIns.getInstance()它返回undefined,我們無法訪問abc.pubVar,爲什麼?

請解釋我喜歡五喲。

在此先感謝。

+0

您運行函數不返回任何東西的第一次? – adeneo

+0

我無法複製錯誤。它似乎工作正常。 – Redu

回答

2
if (!instance) { 
    instance = init(); 

...然後呢?那麼你不會回報任何東西。之後添加return instance;,你會沒事的。

您在實例啓動時返回實例,但如果它不是您指定它並且不返回。

+0

哇,輝煌hehehe忘了這麼做 – xcode

1

var singletonIns = (function() { 
 
    var instance; 
 
    function init() { 
 
    var _pvtVar = 123; 
 
    var pubVar = 111; 
 
    var logPvt = function() { 
 
     console.log(_pvtVar); 
 
    }; 
 
    
 
    return { 
 
     pubVar : pubVar, 
 
     logPvt : logPvt 
 
    }; 
 
    } 
 
    return { 
 
    getInstance : function() { 
 
     if (typeof instance == 'undefined') { 
 
     instance = init(); 
 
     return instance; 
 
     console.log(instance); 
 
     } else { 
 
     return instance; 
 
     } 
 
    } 
 
    }; 
 
})(); 
 

 
console.log(singletonIns.getInstance());

+0

你必須檢查實例變量的類型,如果未定義,然後調用init()其他相同,因爲它是..因此,你無法獲得價值..你可以訪問pubVar值因爲它是該函數的本地/私有範圍,因此您無法訪問任何函數以外的私有變量。請參閱js的範圍文章 – jsquerylover

相關問題