引用循环中最后一个数字的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)
。啊,好的。你能在下面举个例子吗?这很有道理,我从来没有人能更好地解释闭包。非常感谢汉克斯,我很高兴我的解释有用!这很有道理,我从未有人对我更好地解释过闭包。非常感谢汉克斯,我很高兴我的解释有用!