0

我有一些代码使用 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);
 
 });
 
}

数据变量返回真或假。但我无法在从 JSON 返回的函数中获得正确的 BTWnummer。它始终保留 1 个 BTW 编号。我认为 JSON 是异步的,那么我怎样才能在 JSON 代码中得到正确的数字呢?根据我的测试,它确实使用了 callUrl 中的不同数字。

4

1 回答 1

5

问题是调用回调时变量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关键字将定义范围为块的变量。

于 2013-11-12T09:19:53.607 回答