You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在jQuery.ajax.success中调用JS嵌套函数时出现未定义错误

问题分析与解决方案

没错,这绝对是作用域绑定导致的问题!

当你在jQuery.ajax的success回调函数里使用this时,它的指向已经不再是你的toolsform对象了——在传统的函数回调中,this的绑定是由函数的调用方式决定的,这里jQuery会把回调里的this指向Ajax请求的配置对象(或者全局window对象,取决于你用的jQuery版本),所以自然找不到DisplayError这个属于toolsform的方法。

下面给你三种常用的解决办法,任选其一都能搞定:


方法1:提前保存当前对象的引用

在Ajax请求之前,把this(也就是toolsform对象)保存到一个变量里,比如self或者that,然后在回调里用这个变量来调用方法:

this.AjaxSumbit = function() {
    let formData = jQuery("#trialsToolsRegisterForm").serialize();
    formData += '&toolsFormSumbit=1';
    // 保存当前对象的引用到self变量
    const self = this;
    jQuery.ajax({
        type: "POST",
        url: this.sumbitUrl,
        dataType: 'json',
        data: formData,
        success: function(data) {
            if(data.success === false) {
                // 用self代替this调用DisplayError
                self.DisplayError(data.error);
            }
            console.log(data); // show response from the php script.
        }
    });
}

方法2:使用箭头函数

箭头函数不会创建自己的this上下文,它会继承外层作用域的this,也就是toolsform对象,这样直接在回调里用this就能访问到对象的方法:

this.AjaxSumbit = function() {
    let formData = jQuery("#trialsToolsRegisterForm").serialize();
    formData += '&toolsFormSumbit=1';
    jQuery.ajax({
        type: "POST",
        url: this.sumbitUrl,
        dataType: 'json',
        data: formData,
        // 用箭头函数作为回调
        success: (data) => {
            if(data.success === false) {
                this.DisplayError(data.error);
            }
            console.log(data); // show response from the php script.
        }
    });
}

方法3:利用jQuery的context配置项

jQuery的ajax方法提供了context参数,你可以把它设置为this,这样回调函数里的this就会指向你指定的toolsform对象:

this.AjaxSumbit = function() {
    let formData = jQuery("#trialsToolsRegisterForm").serialize();
    formData += '&toolsFormSumbit=1';
    jQuery.ajax({
        type: "POST",
        url: this.sumbitUrl,
        dataType: 'json',
        data: formData,
        // 指定回调里的this指向当前对象
        context: this,
        success: function(data) {
            if(data.success === false) {
                this.DisplayError(data.error);
            }
            console.log(data); // show response from the php script.
        }
    });
}

这三种方法都能完美解决你的问题,选哪种取决于你的代码风格和浏览器兼容性需求——箭头函数比较简洁优雅,但需要环境支持ES6;保存self的方法兼容性最好,老浏览器也能跑;context则是jQuery专门为这类场景提供的解决方案,语义更清晰。

内容的提问来源于stack exchange,提问作者Dale Woods

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:49:52