变量范围

variable scope

本文关键字:范围 变量      更新时间:2023-09-26
这是一个

愚蠢的问题,但我正在尝试使用ajax范围之外var form_data的内容。我将如何做到这一点?form_data似乎只存在于 ajax 函数内部,而不是在 ajax 作用域之外声明变量之后。我认为变量会冒泡,直到它找到未定义var时声明的位置。

为了澄清我的问题,如何在成功函数之外使用来自服务器的结果?我不想限制自己在 ajax 成功回调中做所有事情。

$(function () {
    var form_data; 
    $.ajax({
        type: 'GET',
        url: 'print_form.php',
        data: {
            //data sent to server
        },
        success: function (response) {
            form_data = JSON.parse(response);
            console.log(form_data);            //object is printed out as expected
        },
        error: function () {
            alert('AJAX failed for print_form');
        }
    });
    console.log(form_data);                    //undefined
});

由于 AJAX 代表异步 Javascript 和 XML,因此您的代码不会因为执行 ajax 操作而被阻止,因为它是异步的。在您的情况下,当您通过 ajax 获取数据时,您的 javascript 不会停止继续执行并等待请求成功。相反,当您获取数据时,其余代码仍然会被执行。这就是为什么在通过 ajax 请求从服务器获取之前,form_data 已经在 ajax 请求范围之外打印

让我们测试一下:

尝试使用任何值初始化form_data。你会发现,现在你不会在打印值的 ajax 之外得到未定义。相反,您将获得初始化变量时使用的值。

成功回调选项的替代构造,.done() 方法替换了已弃用的 jqXHR.success() 方法。指 deferred.done() 了解实现细节。 来源: http://api.jquery.com/jquery.ajax/

按照文档中给出的方式构建代码:

我通过隔离 Ajax 调用的设置取得了成功。

function sendAjax(xhrdata) {

       return $.ajax({
        type: 'GET',
        url: 'print_form.php',
         data: xhrdata
        }).promise();
}
sendAjax(data).done(function(response) {
     form_data = JSON.parse(response);
     console.log(form_data); 
}