Javascript jquery函数中var的作用域?

Javascript jquery函数中var的作用域?,javascript,jquery,ajax,Javascript,Jquery,Ajax,可能重复: 为什么我的变量“temp”在ajax之后是0 function calc7() { var temp = 0; $.ajax({ type: "POST", url: 'Helpers/CalcResult7.ashx', data: { GU_ID: '<%=Request.QueryString["GUID"] %>' },

可能重复:

为什么我的变量“temp”在ajax之后是0

function calc7() {
            var temp = 0;
            $.ajax({
                type: "POST",
                url: 'Helpers/CalcResult7.ashx',
                data: { GU_ID: '<%=Request.QueryString["GUID"] %>' },
                success: function (data) {
                    list1 = eval(data);
                    temp = parseFloat(myJSONObject.bindings[0].value);
                    $("#<%=ProResult7.GetSpanId %>").text(addCommas(temp));
                }
            });
            return temp;
        }
函数calc7(){
var-temp=0;
$.ajax({
类型:“POST”,
url:'Helpers/CalcResult7.ashx',
数据:{GU_ID:''},
成功:功能(数据){
列表1=评估(数据);
temp=parseFloat(myJSONObject.bindings[0].value);
$(“#”)文本(addCommas(temp));
}
});
返回温度;
}

因为ajax调用是异步的,所以在更新之前会返回temp…

因为只有从服务器返回HTTP响应,success函数才会运行

Ajax是异步的

对success函数(或从它调用的函数)中的数据执行您想要执行的操作


不要试图等待响应,然后将数据返回到调用函数。

Ajax调用是异步的,但您可以使用它来实现所需的功能。jQuery提供了它自己的实现:。

正如其他人在这里提到的,因为ajax是异步的,所以不能保证在返回语句之前获得更新的temp变量。最好在你的成功职能范围内工作。但是,如果您必须等待调用完成并返回temp变量,则可以通过添加
async:false

function calc7() {
        var temp = 0;
        $.ajax({
            type: "POST",
            url: 'Helpers/CalcResult7.ashx',
            data: { GU_ID: '<%=Request.QueryString["GUID"] %>' },
            async: false,
            success: function (data) {
                list1 = eval(data);
                temp = parseFloat(myJSONObject.bindings[0].value);
                $("#<%=ProResult7.GetSpanId %>").text(addCommas(temp));
            }
        });
        return temp;
    }
函数calc7(){
var-temp=0;
$.ajax({
类型:“POST”,
url:'Helpers/CalcResult7.ashx',
数据:{GU_ID:''},
async:false,
成功:功能(数据){
列表1=评估(数据);
temp=parseFloat(myJSONObject.bindings[0].value);
$(“#”)文本(addCommas(temp));
}
});
返回温度;
}

S.ajax/$.post/$.get等,所有这些都是异步过程(这意味着,即使在$.ajax完成之前,您也将退出循环,即使退出循环后它将进入服务器端)

因此,在循环结束后,如果要检查,则可能没有执行以下语句(取决于数据集)。 temp=parseFloat(myJSONObject.bindings[0].value)

因此,要检查temp变量中的数据,应该在$.ajax中放置一个调试器/警报。例如:

function calc7() {
            var temp = 0;
            $.ajax({
                type: "POST",
                url: 'Helpers/CalcResult7.ashx',
                data: { GU_ID: '<%=Request.QueryString["GUID"] %>' },
                success: function (data) {
                    list1 = eval(data);
                    temp = parseFloat(myJSONObject.bindings[0].value);
alert(temp);
                    $("#<%=ProResult7.GetSpanId %>").text(addCommas(temp));
                }
            });
            return temp;
        }
函数calc7(){
var-temp=0;
$.ajax({
类型:“POST”,
url:'Helpers/CalcResult7.ashx',
数据:{GU_ID:''},
成功:功能(数据){
列表1=评估(数据);
temp=parseFloat(myJSONObject.bindings[0].value);
警报(临时);
$(“#”)文本(addCommas(temp));
}
});
返回温度;
}

现在,您将获得temp的值,非常确定有一个选项可以强制调用同步,然后它将按预期工作。。。。但可能并不像预期的那样。为什么要询问变量的范围?这没什么问题-变量的值不是这样。检查我的回答,可能会有帮助
function calc7() {
            var temp = 0;
            $.ajax({
                type: "POST",
                url: 'Helpers/CalcResult7.ashx',
                data: { GU_ID: '<%=Request.QueryString["GUID"] %>' },
                success: function (data) {
                    list1 = eval(data);
                    temp = parseFloat(myJSONObject.bindings[0].value);
alert(temp);
                    $("#<%=ProResult7.GetSpanId %>").text(addCommas(temp));
                }
            });
            return temp;
        }