dataBase[0].valueline = d3.svg.line()
.x(function(d) { return x(d["Date"]); })
.y(function(d) { return y(d[dataBase[0].columnline]); });
dataBase[1].valueline = d3.svg.line()
.x(function(d) { return x(d["Date"]); })
.y(function(d) { return y(d[dataBase[1].columnline]); });
dataBase[2].valueline = d3.svg.line()
.x(function(d) { return x(d["Date"]); })
.y(function(d) { return y(d[dataBase[2].columnline]); });
dataBase[3].valueline = d3.svg.line()
.x(function(d) { return x(d["Date"]); })
.y(function(d) { return y(d[dataBase[3].columnline]); });
dataBase[4].valueline = d3.svg.line()
.x(function(d) { return x(d["Date"]); })
.y(function(d) { return y(d[dataBase[4].columnline]); });
dataBase[5].valueline = d3.svg.line()
.x(function(d) { return x(d["Date"]); })
.y(function(d) { return y(d[dataBase[5].columnline]); });
dataBase[6].valueline = d3.svg.line()
.x(function(d) { return x(d["Date"]); })
.y(function(d) { return y(d[dataBase[6].columnline]); });
dataBase[7].valueline = d3.svg.line()
.x(function(d) { return x(d["Date"]); })
.y(function(d) { return y(d[dataBase[7].columnline]); });
我已经尝试过以下声明:
for (var i = 0; i < dataBase.length; i++) {
dataBase[i].valueline = d3.svg.line()
.x(function(d) { return x(d["Date"]); })
.y(function(d) { return y(d[dataBase[i].columnline]); });
}
但这不起作用,因为 i 在
function(d) {
return y(d[dataBase[i].columnline]);
}
i 与循环中的 i 不同。我还尝试了 stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example 中的绑定技术
function createfunc(count) {
return function(d) {
return y(d[dataBase[count].columnline]);
};
}
for (var i = 0; i < dataBase.length; i++) {
dataBase[i].valueline = d3.svg.line()
.x(function(d) { return x(d["Date"]); })
.y(createfunc(i));
}
但这也导致了错误。有人能告诉我如何将这八行代码变成一个循环吗?
正如上面的评论者所说,这几乎肯定是一个范围问题,但是在没有看到周围代码的情况下很难确切地说出什么样的范围问题。如果您在 JavaScript 中遇到作用域问题,一个通常的好主意是尽可能多地包装在独立函数中,因为它们每个都有自己的作用域并且可以在一定程度上充当闭包。也许尝试这样的事情:
function xFunc(d) {
return function (d) { return x(d["Date"]) };
}
function yFunc(d, i) {
return function (d) { return y(d[dataBase[i].columnline]) };
}
for (var i = 0; i < dataBase.length; i++) {
dataBase[i].valueline = d3.svg.line()
.x(xFunc(d))
.y(yFunc(d, i));
}
我不知道这是否真的有效,即使有效,也可能有更好的方法来构建这种封闭。如果您不熟悉立即调用函数表达式,请查看这个帖子,并考虑找到一种方法将它们应用到您的代码中。它们非常适合防止 JavaScript 中的范围问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)