我常常看到像这样的代码(这不是D3特定的东西,这只是一个例子):
svg.append("text")
.text(function() {
return round2DP(d.frequency); // d refers to a data element; d.frequency is a float. round2DP() rounds to 2 decimal places.
}) // etc
为什么要使用匿名函数?为什么不写.text(round2DP(d.frequency))
?它似乎更简单,更易读,对我更有意义:为什么在不需要的情况下创建一个不必要的函数?但我一直都看到这一点。这些事情背后的原因是什么?
编辑:为了澄清,在这种特殊情况下,.text()
可以同时接受函数和值,因此不一定期待回调。
答案 0 :(得分:2)
为什么不写.text(round2DP(d.frequency))?
由于function(){}
是功能参考,round2DP(d.frequency)
是函数调用。
在第一种情况下,您传递的是一个函数(尚未执行),在第二种情况下,您传递函数调用的返回值。
这取决于text
方法所期望的参数。如果您的text()
方法接受 function-reference 参数,那么您需要选择第一个,否则如果它正在寻找返回值round2DP(d.frequency)
,则选择第二个。
如果text
同时接受两者并且两者都提供相同的输出,则which one to choose
将取决于您的上下文。您可以根据自己对可读性和可维护性的偏好进行选择。
答案 1 :(得分:-1)
因为您调用函数而不是将其作为回调传递。在你的情况下,正确的方法是:
svg.append("text")
.text(round2DP.bind(null/*context*/, d.frequency))