我有这个功能:
d3.timer(function(elapsed) {
//console.log('change mod pos ...');
// Because the node should remain fixed, the previous position (.px, .py)
// needs to be set to the same value as the new position (.x, .y). This way
// the node will not have any inherent movement.
move.x = move.px = interpolateX(elapsed / duration);
move.y = move.py = interpolateY(elapsed / duration);
// Re-calculate the force layout. This will also invoke tick()
// which will take care of the rendering.
force.start();
// Terminate the timer when the desired duration has elapsed.
return elapsed >= duration;
});
可以在这个小提琴中找到:http://jsfiddle.net/smqsusdw/1/
注意参数'已过去'。这个函数从哪里获得该值?它是否来自'd3.timer'?
显然我不知道javascript的来龙去脉,所以我觉得我错过了一些完全明显的东西。
答案 0 :(得分:2)
是的,你在这个假设中是正确的。当d3.timer
函数调用匿名函数(function(elapsed) {...}
)时,它会将某些内容传递给该函数作为第一个参数。我没有完全确定d3.timer
在没有深入研究代码的情况下做了什么,但它做了类似的事情:
d3.timer = function(anonFunc) {
var elapsed = 0;
// Some code that does something to elapsed
anonFunc(elapsed);
}
您可以在函数开头使用console.log(elapsed);
找出传回匿名函数的内容。您可以在浏览器的Javascript控制台中输入d3.timer
来查看d3.timer的功能。
答案 1 :(得分:1)
timer(callback[, delay[, time]])
每次调用回调时都会传递两个参数:自计时器变为活动状态以来经过的时间以及当前时间。后者对于辅助计时器的精确调度非常有用。
D3基本上使用setInterval
和setTimeout
在延迟ms之后使用以下签名调用您的回调:
timer(function(elapsed, time) {
console.log(elapsed, time);
return elapsed > 200;
}, 150);
您还可以使用Arguments object查看函数已传递的参数。
var x = function(){ console.log(arguments) };
x(1,2)
> [1, 2]