this.function不是函数错误,但函数存在

时间:2012-02-13 16:03:28

标签: javascript function this

我有一些代码来获取日历事件并显示它们。只有在上次呼叫后事件发生变化时才会更新显示。

var calendar = {

    events = null,

    display_calendar_events : function (data) {
        // Some display stuff...
    },

    get_events: function() {

        // Get messages for calendar
        $.getJSON("/ajax/get-events/", function(json){

            var new_events = json.data;
            // If events haven't changed, do nothing
            if (this.events === new_events) {
                return true;
            }

            // Events have changed. 
            // Save new events
            this.events = new_events;

            // Display new events
            this.display_calendar_events(json);
        });
   },
}

我称之为:

calendar.get_queued_events();

问题是,我收到错误“this.display_calendar_events不是函数”(最后一行代码)。 但是,如果我将此行更改为:

calendar.display_canendar_events(josn)

它有效。使用“this.events”存储旧事件在两种情况下都能正常工作。

有人可以向我解释一下吗? “这个”如何为某些东西而不是其他东西工作?感谢。

2 个答案:

答案 0 :(得分:8)

在jQuery AJAX回调中,this引用了ajax请求对象。在AJAX调用之前尝试使用var self = this;,在回调中使用self.display_calendar_events()

或者,您可以直接引用calendar.display_calendar_events()。但这并不像self方法那样容易重构。

答案 1 :(得分:1)

当您在ajax请求中调用this.display_calendar_events()时,您实际上处于与对象不同的上下文中。你必须这样做:

var calendar = {

events = null,

display_calendar_events : function (data) {
    // Some display stuff...
},

get_events: function() {
    var $this = this; 
    // Get messages for calendar
    $.getJSON("/ajax/get-events/", function(json){

        var new_events = json.data;
        // If events haven't changed, do nothing
        if ($this.events === new_events) {
            return true;
        }

        // Events have changed. 
        // Save new events
        $this.events = new_events;

        // Display new events
        $this.display_calendar_events(json);
    });

   },

}