Javascript d3.js与';立即调用函数';

Javascript d3.js与';立即调用函数';,javascript,d3.js,dom-events,Javascript,D3.js,Dom Events,我试图跟踪d3图形中的哪个圆正在被单击,为此我使用了以下代码,该代码按预期工作: var svg = d3.select('#test'); for (var i=0; i < 5; i++){ svg.append('circle') .attr('r', 5) .attr('cx', function(){return 10+ i*11} ) .attr('cy', 10)

我试图跟踪d3图形中的哪个圆正在被单击,为此我使用了以下代码,该代码按预期工作:

var svg = d3.select('#test');

    for (var i=0; i < 5; i++){
        svg.append('circle')
            .attr('r', 5)
            .attr('cx', function(){return 10+ i*11} )
            .attr('cy', 10)
            .on('click', 
                function(d){
                    return function(){console.log(d)}
                }(i)
            );
    }
var svg=d3.选择(“#测试”);
对于(变量i=0;i<5;i++){
append('circle')
.attr('r',5)
.attr('cx',function(){return 10+i*11})
.attr('cy',10)
.on('单击',
职能(d){
返回函数(){console.log(d)}
}(一)
);
}
现在我想重用部分代码,唯一的更改是click事件的函数。我试着做到以下几点:

    function logging(){
        console.log(d);
    }

    for (var i=0; i < 5; i++){
        svg.append('circle')
            .attr('r', 5)
            .attr('cx', function(){return 10+ i*11} )
            .attr('cy', 30)
            .style('fill', 'purple')
            .on('click', 
                function(d){
                    return logging
                }(i)
            );
    }
函数日志记录(){
控制台日志(d);
}
对于(变量i=0;i<5;i++){
append('circle')
.attr('r',5)
.attr('cx',function(){return 10+i*11})
.attr('cy',30)
.style('填充','紫色')
.on('单击',
职能(d){
返回日志记录
}(一)
);
}
但这并不像我预期的那样有效。它记录未定义的日志,而不是0、1、2、3或4。我尝试了不同的版本,包括括号、附加参数、
var loggin=function…
,但我无法让它工作


Fiddle at

您的第一个示例之所以有效,是因为IIFE创建了一个使用正确参数调用log函数的闭包,即
d
设置为
i
的当前值

您的第二个示例确实返回了一个函数(
logging
),但没有任何闭包,该代码相当于
.on('click',logging)

要使其按预期工作,只需将
console.log
替换为对函数的调用即可

.on('click', 
    (function(d){
        return function(){ logging(d); }
    })(i)
)

还有一个演示

你能把IIFE作为函数参数传递吗?我确实知道,要使iLife正常工作,您需要使其成为表达式而不是语句
(函数(d){return logging;}(I))