2017-07-28 56 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

現在嘗試它應該工作 –