你怎么知道这个javascript函数中参数的值?

时间:2015-10-07 15:21:49

标签: javascript jquery d3.js

我有这个功能:

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的来龙去脉,所以我觉得我错过了一些完全明显的东西。

2 个答案:

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

     

每次调用回调时都会传递两个参数:自计时器变为活动状态以来经过的时间以及当前时间。后者对于辅助计时器的精确调度非常有用。

     

https://github.com/d3/d3-timer

D3基本上使用setIntervalsetTimeout在延迟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]