带有此关键字的函数调用未定义

function call with this keyword is undefined

本文关键字:函数调用 未定义 关键字      更新时间:2023-09-26

我通过this指针调用本地(类)函数,但得到一个错误'Uncaught TypeError: undefined is not a function'。在线发生问题CCD_ 3在CCD_。

我的JS(相关)是:

this.createtimetable = function () {
    this.inside_timetable = [];
    for (var d = new Date(in_week_start); d <= new Date(in_week_end); d.setDate(d.getDate() + 1)) {
        console.log(new Date(d));
        daysOfYear.push(new Date(d));
    }
}
this.loadtimetable = function (in_guide_id, in_week_start, in_week_end) {
    this.guide_id = in_guide_id;
    this.week_start = in_week_start;
    this.week_end = in_week_end;
    $.post("./j.php", {
        guide_id : in_guide_id,
        week_start : in_week_start,
        week_end : in_week_end
    })
    .done(function (data) {
        var res_arr = jQuery.parseJSON(data);
        if (res_arr.code == 0) {
            this.excursions_base = res_arr.answer;
            alertify.success("Data extracted");
            this.createtimetable();
        } else {
            alertify.error("Some problem occured." + data);
        }
    }).fail(function () {
        alertify.alert("Error. Please, refresh page, or try later. We are sorry. Write or call us with your question!");
    });
}

按名称调用(即createtimetable())也会失败。谢谢你的想法!

您的代码在回调中执行,this不再指向您的对象。您应该使用一个闭包,将this别名为类似self的东西,或者显式绑定这个

this.createtimetable = function () {
    this.inside_timetable = [];
    for (var d = new Date(in_week_start); d <= new Date(in_week_end); d.setDate(d.getDate() + 1)) {
        console.log(new Date(d));
        daysOfYear.push(new Date(d));
    }
}
this.loadtimetable = function (in_guide_id, in_week_start, in_week_end) {
    this.guide_id = in_guide_id;
    this.week_start = in_week_start;
    this.week_end = in_week_end;
    $.post("./j.php", {
        guide_id: in_guide_id,
        week_start: in_week_start,
        week_end: in_week_end
    })
    .done(function (data) {
        var res_arr = jQuery.parseJSON(data);
        if (res_arr.code == 0) {
            this.excursions_base = res_arr.answer;
            alertify.success("Data extracted");
            this.createtimetable();
        } else {
            alertify.error("Some problem occured." + data);
        }
    }.bind(this)).fail(function () {
        alertify.alert("Error. Please, refresh page, or try later. We are sorry. Write or call us with your question!");
    }.bind(this));
}

$(this)的引用存储在post函数调用之外,并在done回调函数中使用它,这里this不引用您的对象。

this.loadtimetable = function(in_guide_id, in_week_start, in_week_end)
{  
    var self = this; //store reference of this
    $.post( "./j.php", {})
      .done(function( data ) {
        self.createtimetable(); //Here instead of this use your variable
    });
}

编辑

如果您愿意使用$.ajax()而不是$.post()。您可以使用上下文选项。

这个对象将成为所有Ajax相关回调的上下文。默认情况下,上下文是一个表示调用中使用的ajax设置的对象($.ajaxSettings与传递给$.ajax的设置合并)(…)

$.ajax({
    context: this
});