javascript - 可变范围

javascript - variable scope

这是一个愚蠢的问题,但我正在尝试在 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 之外得到 undefined 。相反,您将获得初始化变量的值。

An alternative construct to the success callback option, the .done() method replaces the deprecated jqXHR.success() method. Refer to deferred.done() for implementation details. source: 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); 
}