在嵌套函数Javascript中读取循环变量

时间:2017-07-28 10:29:18

标签: javascript loops

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

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

在旧的JS环境中,您可以创建一个闭包(使用IIFE)来&#34;冻结&#34;变量。像这样:

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

答案 2 :(得分: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)
}