如何在d3中将变量放入.each方法的范围

时间:2013-03-13 14:26:32

标签: javascript d3.js

我正在使用d3,并希望将一些变量传递给selection.each()调用运行的函数的范围。我在外部函数中声明变量eD,然后在该函数中,在声明我的变量之后,在类.points的所有内容上运行匿名函数。我的问题是,我似乎无法将De放入内部函数的范围而不使它们成为全局变量。有没有一种简单的方法将它们传递给内部函数?

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"])
            };
        });
}

1 个答案:

答案 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]){