添加回调函数后,为啥我的变量在里面修改不变?

Posted

技术标签:

【中文标题】添加回调函数后,为啥我的变量在里面修改不变?【英文标题】:After adding callback function, why is my variable modified inside it unaltered?添加回调函数后,为什么我的变量在里面修改不变? 【发布时间】:2015-07-08 00:44:47 【问题描述】:

我知道是异步,但是我按照添加回调函数的步骤Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference 但是我只能访问回调函数内部的更改。这是我的代码 sn-p。请帮忙

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

   

【问题讨论】:

这是因为它不是“之后”。 您是否好奇为什么您的mySeries 变量在callback 函数之外未定义? 是的,我是新手,我需要帮助 好吧,你自己回答了,它超出了范围。您在callback 中定义了它。如果你在函数外添加var mySeries;,那么作用域就是全局的,你可以看到它。 【参考方案1】:

我希望这有助于为您解决问题--

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

mySeries 变量是一个全局变量。它不是callback() 函数之外的“超出范围”。并不是说您无法访问callback() 函数之外的更改;这是您在更改之前无法访问更改。在定义callback()函数之后,代码中出现“MYSERIES out scope”的警告,但在callback()函数执行之前执行。

即使你改变了以下两条语句的顺序,alert 仍然会在回调函数之前执行,因为回调函数是在 ajax 调用返回之前异步执行的。

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

【讨论】:

好的,我现在明白为什么它没有执行,但你知道如何避免或解决这个问题。请注意,如果您有任何想法,我正在使用它来填充 highcharts 的系列数据库数据。谢谢@JohnS @user2217303 - 如果 ajax 调用返回的数据用于创建图表,则必须在回调函数中创建图表。【参考方案2】:

在回调函数外定义mySeries

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

当您第一次将数据放入其中时,javascript 会创建 mySeries。所以在你调用回调后它会被全局定义。

【讨论】:

以上是关于添加回调函数后,为啥我的变量在里面修改不变?的主要内容,如果未能解决你的问题,请参考以下文章

boost::asio,为啥我的套接字在调用 async_receive_from 后立即运行回调函数?

Javascript:为啥不能在回调函数中获取变量?

如何从回调函数中修改全局变量。在 node.js 中

为啥我的 iOS 录音回调中的音频缓冲区未满?

js中的回调函数

matlab gui 清除图形