javascript - Singleton 中的公共(public)函数调用自身

标签 javascript singleton

我正在尝试使用单例模式,但在实现递归公共(public)函数时遇到问题。

var singleton = (function(){
    var self = this;
    function privateFunc(){
        console.log('I can only be accessed from within!');
    }
    return{
        publicFunc: function(){
            //More stuff here
            setTimeout(self.publicFunc, 1000);
        }
    }
})();

我用singleton.publicFunc调用它

我收到此错误未捕获类型错误:无法调用未定义的方法“publicFunc”

我的理解是 var self 实际上是这个实例中的 Window 对象,所以我必须传递 singleton.publicFunc 作为回调才能使其工作,但它并没有看起来不太“干”(不要重复自己)。有没有 使用单例时更好的方法来完成此任务?

通过 API 调用

var wikiAPI = (function(){
    var self = this;
    return {
      getRandomArticle : function() {
        return $.getJSON("http://en.wikipedia.org/w/api.php?action=query&generator=random&grnnamespace=0&prop=extracts&exintro=&format=json&callback=?", function (data) {
        });
      },
      fireAPICalls : function() {
        self.getRandomArticle().done(function(data) {
          for(var id in data.query.pages) {
            this.data = data.query.pages[id];
          }
          console.log(this.data);
          setTimeout(self.fireAPICalls, 1000);
        });
      }
    }
  })();

最佳答案

您可以使用 named function expression像这样:

var singleton = (function(){
    var self = this;
    function privateFunc(){
        console.log('I can only be accessed from within!');
    }
    return{
        publicFunc: function nameVisibleOnlyInsideThisFunction(){
                           //^-------------------------------^
            //More stuff here
            setTimeout(nameVisibleOnlyInsideThisFunction, 1000);
        }
    }
})();
<小时/>

我刚刚看到你的编辑。有用的是对您尝试调用的函数的引用。那么像这样的事情怎么样:

var wikiAPI = (function(){
    var self = this;
    var randomArticle = function() {
        return $.getJSON("http://en.wikipedia.org/w/api.php?action=query&generator=random&grnnamespace=0&prop=extracts&exintro=&format=json&callback=?", function (data) {
        });
      };
    var repeatFunc = function fireApi() {
        randomArticle().done(function(data) {
          for(var id in data.query.pages) {
            this.data = data.query.pages[id];
          }
          console.log(this.data);
          setTimeout(fireApi, 1000);
        });
      };
    return {
      getRandomArticle : randomArticle,
      fireAPICalls : repeatFunc
    }
  })();

关于javascript - Singleton 中的公共(public)函数调用自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20192017/

相关文章:

javascript - 如何在不改变 redux 状态的情况下增加帖子?

javascript - 数组原型(prototype)是只读的,不应添加属性 no-extend-native

具有单例用法的 JavaScript 命名空间?我难住了!

java - 安全的 Nashorn JS 执行

javascript - Jquery 动画从左到右不起作用

javascript - 使用 Facebook Messenger 设置基本模板卡片时遇到问题

ruby - 正常方法中的 "self"与单例方法中的 "self"?

javascript - 在 JavaScript 中,有没有办法生成单个变量以在项目中的 .js 文件之间共享?

PHP Singleton 设计模式继承错误

c# - 单例属性