提问者:小点点

添加回调函数后,为什么我的变量在里面被修改了却不变?


我知道这是异步性,但我已经遵循了添加回调函数的步骤,为什么我的变量在函数中修改后没有改变呢?-异步代码引用,但我只能访问回调函数内部的更改。这是我的代码片段。请帮忙

function callback(point) {

       for (i = 0; i < point.length; i++) {
           myDate[i] = point[i].date_time;
           myValue[i] = point[i].my_value;
       }

       for (j = 0; j < myDate.length; j++) {
           var temp = new Array(myDate[j], myValue[j]);
           mySeries[j] = temp;
       }
       alert("MYSERIES in scope:  " + mySeries); //defined

   }
   alert("MYSERIES out scope:  " + mySeries); // undefined
   getAllMessagesforChart(callback);

   function getAllMessagesforChart(callback) {
                var data = @Html.Raw(JsonConvert.SerializeObject(this.Model))


        $.ajax({
            url: '/messages/GetMessagesforChat',
            data: {
                id: data.id,
            },
            contentType: 'application/html ; charset:utf-8',
            type: 'GET',
            dataType: 'JSON'

        }).success(function (data) {
            callback(data);
        }).error(function (e) {
            alert("error " + e)
        })     

   }

共2个答案

匿名用户

我希望这能帮你把事情弄清楚--

这不是一个范围问题。这是执行语句的顺序问题。如果你在Amazon.com上点了东西,你会立即走到你的门廊并期望找到包裹吗?不,你得等无人机到那里。

mySeries变量是一个全局变量。它不是callback()函数之外的“超出范围”。并不是说您不能访问callback()函数之外的更改;这是因为您无法在更改发生之前访问这些更改。带有“MySeries out Scope”的警报出现在Callback()函数定义之后的代码中,但它是在Callback()函数执行之前执行的。

即使您要更改以下两条语句的顺序,警报仍将在回调函数之前执行,因为回调函数直到ajax调用同步返回才执行。

getAllMessagesforChart(callback);
alert("MYSERIES out scope:  " + mySeries); // undefined

匿名用户

在回调函数外部定义mySeries:

var mySeries = [];
function callback(point) { ... }

JavaScript在首次将数据放入时创建了mySeries。因此在调用回调之后,它将被全局定义。

相关问题