在JavaScript回调函数中设置局部变量

我对JavaScript比较陌生,我认为我知道回调函数是如何工作的,但经过几个小时的网络搜索,我仍然不明白为什么我的代码不起作用。

我正在发出一个返回字符串数组的AJAX请求。 我正在尝试将此数组设置为局部变量,但一旦执行回调函数,它似乎就会丢失它的值。

var array; $.ajax({ type: 'GET', url: 'include/load_array.php', dataType: 'json', success: function(data){ array = data; }, error: function(jqXHR, textStatus, errorThrown){ alert("Error loading the data"); } }); console.debug(array); 

在控制台中, array显示为未定义。 任何人都可以向我解释为什么没有设置它以及如何在回调函数中设置局部变量。

这里的问题是,当ajax调用异步执行时, console.log同步执行。 因此它在回调完成之前运行,因此它仍然将array视为undefined因为还没有运行success 。 为了完成这项工作,您需要延迟console.log调用,直到success完成。

 $(document).ready(function() { var array; var runLog = function() { console.log(array); }; $.ajax({ type: 'GET', url: 'include/load_array.php', dataType: 'json', success: function(data){ array = data; runlog(); }}); }); 

ajax中的第一个A用于异步,这意味着在调试数组时,结果仍未传递。 数组在显示它的值时未定义。 您需要在array = data下面执行console.debug。

success函数不会立即执行,而是仅在HTTP响应到达后才执行。 因此,此时array仍未undefined 。 如果要对HTTP响应数据执行操作,请在success函数内执行操作,或者在函数内部定义该操作,然后在success回调中调用该函数。

尝试调用函数在success后设置此变量:

 var array; var goodToProceed = function(myArr) { console.debug(myArr); }; $.ajax({ type: 'GET', url: 'include/load_array.php', dataType: 'json', success: function(data){ goodToProceed(data); }, error: function(jqXHR, textStatus, errorThrown){ alert("Error loading the data"); } }); 

AJAX是异步的。 您正在设置array变量,但在该debug执行之后才会设置。 进行AJAX调用会发送请求,但随后会继续执行代码。 稍后,请求将返回,您的successerror函数将执行。