在d3.layout.force的源代码的第158行中,有此代码

force.charge = function(x) {
    if (!arguments.length) return charge;
    charge = typeof x === "function" ? x : +x;
    return force;
};


现在,如果您转到第225行,您将看到

charges = [];
if (typeof charge === "function") {
  for (i = 0; i < n; ++i) {
    charges[i] = +charge.call(this, nodes[i], i);
  }
} else {
  for (i = 0; i < n; ++i) {
    charges[i] = charge;
  }
}


我在这里不明白的是线

charges[i] = +charge.call(this, nodes[i], i);


我是JavaScript新手,无法理解这里发生的情况。

据我了解,charge只接受一个参数(x)。这里传递“ this”以给出当前对象的上下文,但是其他两个呢? “ nodes[i]”和“ i”中的哪一个被视为“ x”?

同样,“ = +”在这里做什么?

最佳答案

您必须更仔细地遵循charge。它是在line 11中定义的变量:

charge = -30,


您引用的功能force.charge用于设置费用,而不是+charge.call(this, nodes[i], i);中引用的功能。看看force.charge的第二行:

charge = typeof x === "function" ? x : +x;


x可以是您传递的用于动态计算费用的函数(回调)。当前节点(nodes[i])和节点索引(i)将传递到此回调,以便您可以基于以下值动态计算费用:

force.charge(function(node, index) {
    return index * 2;
});


x(因此是charge)也可以是数字或数字字符串。这就是为什么要预先测试charge是否为函数的原因:

if (typeof charge === "function") {
  // function so we call it and pass the current node and index
} else {
  // static value, the same for each node
}




因此,无论函数定义了多少个参数,您始终可以将任意数量的参数传递给该函数。例如:

function foo() {
    alert([].join.call(null, arguments));
}

foo('a', 'b');


将提醒a,b



回答您的问题:传递给.call() .apply() 的参数以相同的顺序传递给函数。因此,如果我具有函数function foo(a, b, c),则foo.call(null, x, y)会将x传递为a,将y传递为bcundefined)。

+运算符是unary plus operator ,它仅将操作数转换为数字。

09-25 19:14