引用循环中最后一个数字的JavaScript循环

引用循环中最后一个数字的JavaScript循环,javascript,loops,charts,google-visualization,Javascript,Loops,Charts,Google Visualization,与谷歌可视化库合作,但我认为这在这里并不重要 我有一个名为data的变量。Hwith的长度为5 我想在这里循环一下: var cols = new Array(); for (var x = 1; x < data.H.length + 1; x++) { var idx = x - 1; console.log(idx); cols.push({ type: 'number',

与谷歌可视化库合作,但我认为这在这里并不重要

我有一个名为
data的变量。H
with的长度为
5

我想在这里循环一下:

var cols = new Array();
        for (var x = 1; x < data.H.length + 1; x++) {
          var idx = x - 1;
          console.log(idx);
          cols.push({
              type: 'number',
              label: data.getColumnLabel(idx),
              calc: function (dt, row) {
                  console.log("row: ", row, "Idx: ",idx);
                  var val = dt.getValue(0, idx); // this is always 5
                  for (var i = 1, total = 0, cols = dt.getNumberOfColumns(); i < cols; i++) {
                      total += dt.getValue(row, i);
                  }
                  var percent = val / total;
                  return {v: percent, f: (percent * 100).toFixed(2) + '%'}; // return value and value
              }
          });
        };
        view.setColumns(cols);
var cols=new Array();
对于(变量x=1;x
问题是我的
calc
方法需要引用
idx
。然而,idx总是5。每个回路上的值应为1、2、3、4和5


这是怎么回事?如何使calc函数在循环时引用数字

当您调用calc方法时,循环将已经完成,所有calc函数将在其最后状态中保留对(相同)
x
idx
的引用。您需要引入另一个函数/作用域,以便能够“冻结”每个特定的
idx
。(语法上)最简单的方法是创建一个单独的函数,将
idx
作为参数,然后返回另一个函数

function createCalcFunction(idx) {
    return function (dt, row) {
        /* make a local copy */
        var localIdx = parseInt(idx, 10);
        console.log("row: ", row, "Idx: ",localIdx);

        var val = dt.getValue(0, localIdx);

        for (var i = 1, total = 0, cols = dt.getNumberOfColumns(); i < cols; i++) {
          total += dt.getValue(row, i);
        }
        var percent = val / total;
        return {v: percent, f: (percent * 100).toFixed(2) + '%'}; // return value and value
    }
}

var cols = [];
for (var x = 1; x < data.H.length + 1; x++) {
    var idx = x - 1;
    console.log(idx);
    cols.push({
        type: 'number',
        label: data.getColumnLabel(idx),
        calc: createCalcFunction(idx);
    });
};
view.setColumns(cols);
函数createCalcFunction(idx){
返回函数(dt,行){
/*制作本地副本*/
var localIdx=parseInt(idx,10);
log(“行:”,行,“Idx:”,localIdx);
var val=dt.getValue(0,dx);
对于(var i=1,total=0,cols=dt.getNumberOfColumns();i
当您调用calc方法时,循环将已经完成,所有calc函数将在其最后状态中保留对(相同)
x
idx
的引用。您需要引入另一个函数/作用域,以便能够“冻结”每个特定的
idx
。(语法上)最简单的方法是创建一个单独的函数,将
idx
作为参数,然后返回另一个函数

function createCalcFunction(idx) {
    return function (dt, row) {
        /* make a local copy */
        var localIdx = parseInt(idx, 10);
        console.log("row: ", row, "Idx: ",localIdx);

        var val = dt.getValue(0, localIdx);

        for (var i = 1, total = 0, cols = dt.getNumberOfColumns(); i < cols; i++) {
          total += dt.getValue(row, i);
        }
        var percent = val / total;
        return {v: percent, f: (percent * 100).toFixed(2) + '%'}; // return value and value
    }
}

var cols = [];
for (var x = 1; x < data.H.length + 1; x++) {
    var idx = x - 1;
    console.log(idx);
    cols.push({
        type: 'number',
        label: data.getColumnLabel(idx),
        calc: createCalcFunction(idx);
    });
};
view.setColumns(cols);
函数createCalcFunction(idx){
返回函数(dt,行){
/*制作本地副本*/
var localIdx=parseInt(idx,10);
log(“行:”,行,“Idx:”,localIdx);
var val=dt.getValue(0,dx);
对于(var i=1,total=0,cols=dt.getNumberOfColumns();i
外观可能与我要找的相似。您能用我的calc方法解释一下吗?当您调用calc方法时,循环将已经完成,所有
calc
函数将在其最后状态保留对(相同)
x
的引用。您需要引入另一个函数/作用域,以便能够“冻结”每个特定的
x
。(语法上)最简单的方法是创建一个单独的函数,将
x
作为参数,然后返回另一个函数。然后你会有类似于
calc:createCalc(x)
。啊,好的。你能在下面举个例子吗?可能和我要找的相似。您能用我的calc方法解释一下吗?当您调用calc方法时,循环将已经完成,所有
calc
函数将在其最后状态保留对(相同)
x
的引用。您需要引入另一个函数/作用域,以便能够“冻结”每个特定的
x
。(语法上)最简单的方法是创建一个单独的函数,将
x
作为参数,然后返回另一个函数。然后你会有类似于
calc:createCalc(x)
。啊,好的。你能在下面举个例子吗?这很有道理,我从来没有人能更好地解释闭包。非常感谢汉克斯,我很高兴我的解释有用!这很有道理,我从未有人对我更好地解释过闭包。非常感谢汉克斯,我很高兴我的解释有用!