我正在尝试使用单例模式,但在实现递归公共(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/