我正在使用d3,并希望将一些变量传递给selection.each()调用运行的函数的范围。我在外部函数中声明变量e
和D
,然后在该函数中,在声明我的变量之后,在类.points
的所有内容上运行匿名函数。我的问题是,我似乎无法将D
和e
放入内部函数的范围而不使它们成为全局变量。有没有一种简单的方法将它们传递给内部函数?
function endSelection(d){
var e = selector.extent();
var D = d;
mainSVG.selectAll(".points")
.each(function(d){
if(d[D.x] >= e[0][0]){
d3.select(this).call(addClass,["foo"])
d3.select(this).call(removeClass,["bar"])
} else {
d3.select(this).call(addClass,["bar"])
d3.select(this).call(removeClass,["foo"])
};
});
}
答案 0 :(得分:3)
您不需要在该匿名函数的形式参数中列出“d”。
mainSVG.selectAll(".points")
.each(function(){
if(d[D.x] >= e[0][0]){
在外部作用域中声明的变量始终在内部作用域中可用,除非它们被相同标识符的更多内部声明“遮蔽”。这就是您的代码中发生的事情。
你根本不需要“D”;只是引用“d”。现在,如果d3代码将一些有用的东西传递给用作.each()
迭代器的函数,则声明它,但给它一个与“d”不同的名称:
mainSVG.selectAll(".points")
.each(function(not_d){
if(not_d[d.x] >= e[0][0]){