javascript-变量范围

javascript-变量范围,javascript,scope,Javascript,Scope,这是一个愚蠢的问题,但我试图在ajax范围之外使用var form\u data中的内容。我该怎么做呢?form_数据似乎只存在于ajax函数内部,而不是外部,即使在ajax范围之外声明了变量。我以为变量会冒泡出来,直到它发现在未定义var时声明的位置 为了澄清我的问题,我如何在success函数之外使用来自服务器的结果?我不想限制自己在ajax成功回调中做任何事情 $(function () { var form_data; $.ajax({ type:

这是一个愚蠢的问题,但我试图在ajax范围之外使用
var form\u data
中的内容。我该怎么做呢?form_数据似乎只存在于ajax函数内部,而不是外部,即使在ajax范围之外声明了变量。我以为变量会冒泡出来,直到它发现在未定义
var
时声明的位置

为了澄清我的问题,我如何在success函数之外使用来自服务器的结果?我不想限制自己在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\u数据
已经在ajax请求范围之外打印出来了

让我们测试一下:

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

成功回调选项的另一个构造是.done() 方法替换不推荐使用的jqXHR.success()方法。提到 deferred.done()获取实现详细信息。 资料来源:

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

我成功地完成了这个隔离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); 
}

表单_数据仅在成功函数中分配。由于它是异步的,所以当ajax请求发生时,ajax函数外部的
console.log
仍在被调用,使用
done()
启动。。查看jQuery文档这是否意味着我必须在成功回调中对来自AJAX的响应执行所有需要执行的操作?要么在
.success
中执行,要么在使用
.done
完成响应时执行其余的代码。基本上,如果您想在获得响应后的某个地方使用变量它是由服务器的响应初始化的,很明显要等到您获得数据。当您在收到服务响应之前显示数据时,您得到的是
未定义的