【问题标题】:I want to use a anonymous function inside an object我想在对象中使用匿名函数
【发布时间】:2012-12-10 20:10:09
【问题描述】:

我有此代码用于我想使用的新闻源。

我希望它看起来像这样:

function News(){

    //Load new comments every 5 sec
    setTimeout((function(){
        console.log(this); //Returns Object #News
        this.loadNewsFeed();
    }).call(this),5000);

    this.loadNewsFeed = function(){
        // Implementation here
    }
}

这里的问题是它说对象新闻没有一个名为loadNewsFeed的方法!

如果我将匿名函数放在对象 News 之外,我已经让它工作了。

像这样:

var news = new News();
//Load new comments every 5 sec
(function loopNews(){
    news.loadNewsFeed();
    setTimeout(loopNews,5000);
})();

那么我该如何对象News中做到这一点?

【问题讨论】:

标签: javascript oop function settimeout infinite-loop


【解决方案1】:

这应该可行:

function News()
{
    var self = this;

    this.loadNewsFeed = function(){
        // Implementation here
    };

    //Load new comments every 5 sec
    setInterval(function handler() // setInterval for endless calls
    {
        console.log(self); //Returns Object #News
        self.loadNewsFeed();
        return handler;
    }(), 5000);
}

解释:
call(this)直接调用处理程序 - 并将undefined返回到setInterval,这意味着它立即执行但没有设置处理程序 .
处理函数在全局上下文中执行,所以thiswindow 对象。局部变量self “注入” 当前(和期望的)this - 作为self

编辑 2:
现在立即执行 注册处理程序。

【讨论】:

  • 昨天才提出这个问题 - 见这里:stackoverflow.com/questions/13771889/…
  • 嗯,在你更新@Warappa 之后它不起作用。仍然说:#Object 没有一个名为 loadNewsFeed 的方法
  • 哦,编辑太多了 ;) - 只需在 setInterval 之前移动处理程序定义即可!
  • 你能添加一个新的答案吗?:o 因为我真的不明白。 :/ 我希望它像你在这里写的那样工作:现在立即执行并注册一个处理程序。
  • 嗯...我刚刚复制了代码(并添加了new News()),它可以工作:jsfiddle.net/sfgVy
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-05
  • 2020-01-05
  • 2013-06-01
  • 2014-09-11
相关资源
最近更新 更多