AJAX 回调中的变量值错误

Wrong value of variable in AJAX callback

本文关键字:变量值 错误 回调 AJAX      更新时间:2023-09-26

我有一些使用 JSON 检查增值税号的代码。

我需要知道哪些增值税号是正确的

BTW[0] = 'NL1234567890';
BTW[1] = 'NL1233537891';
BTW[2] = 'NL1232346894';
var arraylength = BTW.length;
for (var i = 0; i < arraylength; i++) {
  
 var BTWnummer = BTW[i];
 
 callUrl = 'http://isvat.appspot.com/'+Land+'/'+BTWnummer+'/?callback=?';
 
 $.getJSON(callUrl, BTWnummer, function(data){
 alert(data+' '+BTWnummer);
 
 });
 
}

数据变量返回 true 或 false。但是我无法在从 JSON 返回的函数中获得正确的 BTWnummer。它始终保留 1 个 BTW 号码。我认为 JSON 是异步的,那么如何在 JSON 代码中获取正确的数字?根据我的测试,它确实在 callUrl 中使用了不同的数字。

问题是调用

回调时变量BTWnummer已更改,因为循环在异步回调之前完全执行。

你可以将其值保存在一个立即调用的函数中:

for (var i = 0; i < arraylength; i++) {
   (function(BTWnummer){
      var callUrl = 'http://isvat.appspot.com/'+Land+'/'+BTWnummer+'/?callback=?';
      $.getJSON(callUrl, BTWnummer, function(data){
         alert(data+' '+BTWnummer);
      });
   })(BTW[i]);
}

如果很难阅读,这里有另一种用命名函数(而不是匿名函数)放置它的方法:

function f(BTWnummer){
  var callUrl = 'http://isvat.appspot.com/'+Land+'/'+BTWnummer+'/?callback=?';
  $.getJSON(callUrl, BTWnummer, function(data){
     alert(data+' '+BTWnummer);
  });
}
for (var i = 0; i < arraylength; i++) {
    f(BTW[i]);
}

这是有效的,因为JavaScript中变量的作用域是函数执行。f的不同执行存储不同的BTWnummer值(寻找"闭包"以更深入地了解)。

在不久的将来,ES6 将不再需要这个技巧,因为 let 关键字将定义范围为块的变量。