Javascript闭包和d3

Javascript闭包和d3,javascript,d3.js,Javascript,D3.js,所以在d3中,我想要一个数组来表示这样的函数 var data = [44,23]; var line = []; for (var i = 0; i < data.length; i++) { line[i] = d3.svg.line() .interpolate("monotone") .y(function(d) { return data[i];

所以在d3中,我想要一个数组来表示这样的函数

var data = [44,23];
var line = [];
for (var i = 0; i < data.length; i++) {
    line[i] = d3.svg.line()
           .interpolate("monotone")
           .y(function(d) {
                return data[i];               
            });
}
var数据=[44,23];
var行=[];
对于(变量i=0;i

然而,由于闭包的工作方式,i总是被计算为2。有没有一种方法可以使它的计算结果始终为0,然后为1,而不是2?

如果异步调用传递到
y
中的内联函数,
i
在调用时将等于
data.length
。为了避免这种情况,您可以简单地使用array
forEach
方法,如下所示:

var data = [44,23];
var line = [];
data.forEach(function(dataItem, i) {
    line[i] = d3.svg.line()
       .interpolate("monotone")
       .y(function(d) {
            return dataItem;               
        });
});

如果正在异步调用传递到
y
的内联函数,
i
在调用时将等于
data.length
。为了避免这种情况,您可以简单地使用array
forEach
方法,如下所示:

var data = [44,23];
var line = [];
data.forEach(function(dataItem, i) {
    line[i] = d3.svg.line()
       .interpolate("monotone")
       .y(function(d) {
            return dataItem;               
        });
});

只需在JSFIDLE上运行代码,并将d3.js粘贴到源代码中。我的计算结果是0,1。“因为闭包的工作方式”是什么意思?稍后当我需要调用第[0]行()或第[1]行()时,它基本上会调用返回数据[2];我们需要看到更多的代码。根据您所说的,数据[2]将返回未定义的
,因为它只有2个元素。我的计算结果是0,1。“因为闭包的工作方式”是什么意思?稍后当我需要调用第[0]行()或第[1]行()时,它基本上会调用返回数据[2];我们需要看到更多的代码。根据您所说的,数据[2]将返回未定义的
,因为它只有2个元素。请参阅