我的单例设计模式有什么问题?

What is wrong with my singleton design pattern?

 var singleton = (function(){

  var instance;

  function init(){

  var privateVariable = 'Private'
  var privateMethod   = function(){ console.log('Am private');}

    return {

    publicField  : 'Public',
    publicMethod : function(){ console.log('Am public');},
    randomVar    : Math.random()
  };
};

return function(){
  if(!instance) { instance = init(); } 
  else { return instance; }
}

})();

var single1 = singleton();
var single2 = singleton();

console.log(single1.randomVar == single2.randomVar);

应该 return true ,returned: TypeError: single1 is undefined, 但是如果我删除了函数周围的 IIFE 环绕,它就可以完美地工作所以我不明白为什么会这样?

我猜你想要这个。总是returninstance,即使是第一次

return function(){
   if(!instance) {
      instance = init();
   } 
   return instance;
}

在初始调用中你没有返回任何东西,你只是在初始化它 - 因此 undefined。在初始化调用之后放置一个 return instance 应该可以解决问题。

您要么想要添加 return 关键字

return function(){
  if(!instance) { return instance = init(); } 
  else { return instance; }
}

或省略 else:

return function(){
  if(!instance) { instance = init(); } 
  return instance;
}

删除 return 中的其他部分。

  return function() {
    if (!instance) {
      instance = init();
    }
    return instance;
  }

var singleton = (function() {

  var instance;

  function init() {

    var privateVariable = 'Private'
    var privateMethod = function() {
      console.log('Am private');
    }

    return {

      publicField: 'Public',
      publicMethod: function() {
        console.log('Am public');
      },
      randomVar: Math.random()
    };
  };

  return function() {
    if (!instance) {
      instance = init();
    }
    return instance;
  }

})();

var single1 = singleton();
var single2 = singleton();

console.log(single1.randomVar == single2.randomVar);