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



我知道这是异步性的,但是我已经按照添加回调函数的步骤进行操作 为什么我的变量在函数内部修改后保持不变? - 异步代码参考,但我只能访问回调函数内的更改。这是我的代码片段。请帮忙

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)
        })     
   }

我希望这有助于为您澄清问题--

这不是范围问题。这是语句执行顺序的问题。如果您从 amazon.com 订购东西,您会立即走到前弯腰并期望找到包裹吗?不,你必须等待无人机到达那里。

mySeries变量是全局变量。它不会在callback()函数之外"超出范围"。这并不是说您无法访问callback()功能之外的更改;而是在进行更改之前,您无法访问更改。定义callback()函数后,代码中会显示带有"MYSERIES out scope"的警报,但在执行callback()函数之前执行。

即使更改以下两个语句的顺序,警报仍将在回调函数之前执行,因为在 ajax 调用异步返回之前不会执行回调函数。

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

在回调函数外部定义mySeries

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

JavaScript 在你第一次将数据放入其中时创建了mySeries。因此,在调用回调后,它会得到全局定义。

最新更新