2017-07-28 48 views
0
for (var j=0; j<charts.length; j++){ 
    var chart = charts[j].chartImage; 
    chart["export"].capture({}, function() { 
     this.toPNG({}, function(data) { 
      saved_charts[j] = data; 
      charts_remaining--; 

      if (charts_remaining == 0) { 
       console.log(saved_charts[0]); 
       console.log(saved_charts[1]); 
      } 
     }) 
    }) 
} 

我在saved_charts上的问题[j]它无法读取j变量,它说“可变的变量可从闭包访问”。有没有其他的方式,所以我可以得到j变量?我知道我可以使用array.push(),但由于某种原因,代码以不规则的方式生成数据值,因此不会相应地返回数据值。我认为这是因为一些数据太大,所以函数首先返回较小的数据。对不起,我仍然很难理解Javasript在嵌套函数中读取循环变量Javascript

回答

3

这应该工作

for (let j=0; j<charts.length; j++){ 

如果不支持let关键字,这是经典的方式:

for (var j=0; j<charts.length; j++){ 
    var chart = charts[j].chartImage; 
    (function(j) { 
     chart["export"].capture({}, function() { 
      this.toPNG({}, function(data) { 
       saved_charts[j] = data; 
      }) 
     }) 
    })(j); 
} 
+0

我的JavaScript版本:( –

+0

@ArdiSugiarto修改我的回答再次尝试。 =) – Val

+0

这个作品!谢谢!我一整天都陷入这个问题。但是我已经更新了我的JavaScript版本,它会导致任何问题吗? –

1

在老JS环境中,您可以创建一个闭包(用IIFE)来“冻结”变量。就像这样:

for (var j = 0; j < 10; j++){ 
    (function(j) { 
     setTimeout(function() {console.log(j)}, 10); 
    })(j); 
} 
0

试试这个

for (var j=0; j<charts.length; j++){ 
    var chart = charts[j].chartImage; 
    (function(p){ 
     chart["export"].capture({}, function() { 
      (function(q){ 
      this.toPNG({}, function(data) { 
       saved_charts[q] = data; 
       charts_remaining--; 

       if (charts_remaining == 0) { 
        console.log(saved_charts[0]); 
        console.log(saved_charts[1]); 
       } 
      }) 
      })(p) 
     }) 
    })(j) 
} 

尽量不支持此

for (var j=0; j<charts.length; j++){ 
    var chart = charts[j].chartImage; 
    (function(p){ 
     chart["export"].capture({}, function() { 
      this.toPNG({}, function(data) { 
       saved_charts[p] = data; 
       charts_remaining--; 

       if (charts_remaining == 0) { 
        console.log(saved_charts[0]); 
        console.log(saved_charts[1]); 
       } 
      }) 
     }) 
    })(j) 
} 
+0

这将不会在封闭中捕获'j':https://jsfiddle.net/c9a13pwc/ –

+0

糟糕我的错误等待我修复 –

+0

现在尝试它应该工作 –