添加回调函数后,为啥我的变量在里面修改不变?
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
。所以在你调用回调后它会被全局定义。
【讨论】:
以上是关于添加回调函数后,为啥我的变量在里面修改不变?的主要内容,如果未能解决你的问题,请参考以下文章