在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
传递为b
(c
为undefined
)。+
运算符是unary plus operator ,它仅将操作数转换为数字。