我知道这是异步性的,但是我已经按照添加回调函数的步骤进行操作 为什么我的变量在函数内部修改后保持不变? - 异步代码参考,但我只能访问回调函数内的更改。这是我的代码片段。请帮忙
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
。因此,在调用回调后,它会得到全局定义。