让我试着解释一下我奇怪的困惑
我正在尝试了解d3.js
。我看到很多函数带有一些奇怪的参数(至少对我来说它们看起来很奇怪)。
d3.selectAll("p").style("color", function(d, i) {
return i % 2 ? "#fff" : "#eee";
});
d
在这做什么?当它没用时为什么会通过?i
(以及值)过去了哪里?此外,我关注Jan's tutorial并构建了fiddle。这也有一些奇怪的功能参数:
.attr("cy", function(d) {
return y(d.y)
})
.delay(function(d, i) {
return i * del(Math.random())
})
d
(以及值)过去了哪里?答案 0 :(得分:3)
import java.security.Key; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; public class EncryptDecryptAESAlgo { private static final String ALGO = "AES"; private static final byte[] keyValue = new byte[] { 'A', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p' }; public String encrypt(String Data) throws Exception { String encryptedValue = ""; try { Key key = generateKey(); Cipher c = Cipher.getInstance(ALGO); c.init(Cipher.ENCRYPT_MODE, key); byte[] encVal = c.doFinal(Data.getBytes()); encryptedValue = new BASE64Encoder().encode(encVal); return encryptedValue; } catch (Exception e) { } return encryptedValue; } public String decrypt(String encryptedData) throws Exception { String decryptedValue = ""; try { Key key = generateKey(); Cipher c = Cipher.getInstance(ALGO); c.init(Cipher.DECRYPT_MODE, key); byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData); byte[] decValue = c.doFinal(decordedValue); decryptedValue = new String(decValue); return decryptedValue; } catch (Exception e) { } return decryptedValue; } private Key generateKey() throws Exception { Key key = new SecretKeySpec(keyValue, ALGO); return key; } }
在这做什么?当它没用时为什么会通过?
d
函数将使用一组特定参数调用回调。回调事件并不需要第一个参数的事实并没有改变style
将其调用的方式。所以回调必须接受这个参数,然后忽略它。
从
style
(以及值)传递到哪里?
i
功能。调用回调的是什么,所以它决定了回调接收的参数的值。
这是一个接受和调用回调的函数示例,这可能有助于澄清事情。见评论:
style

答案 1 :(得分:3)
这些是传递给您作为引用提供的处理函数(也称为回调)的参数。
这是一个有效的例子:
function main(a, b, callbackFn) {
callbackFn(a * b);
}
main(2, 3, function(result) {
console.log(result); // = 6
});
您可以从中看到,当您致电main()
时,您将提供匿名功能的参考。然后从main()
内调用匿名函数并传递执行的操作的结果。
在某些情况下,您可能不需要对操作结果执行任何操作,只需在操作完成时执行一些代码 - 这就是为什么提供d
变量但未使用的原因。< / p>
答案 2 :(得分:1)
在D3.js中,选择内部的匿名函数会按顺序传递三个值,传统上称为d
,i
和p
(更多关于下面这些字母):
d
是数据(数据的单数)i
是该数据的索引这是它的工作原理,点击“运行代码段”:
var testData = [43, 2, 57, 42, 17];
var test= d3.selectAll(".test")
.data(testData)
.enter()
.append("p");
test.attr("foo", function(d, i) { console.log("Data: " + JSON.stringify(d), "\nIndex: " + JSON.stringify(i))
})
<script src="https://d3js.org/d3.v4.min.js"></script>
由于索引始终是第二个值,因此即使您不使用它,也必须传递d
。
我们可以使用其他字母吗?
名字无关紧要,只有订单。传统上,我们使用“d”,因为它是“数据”的首字母,“i”因为“索引”和“p”而因为“父”。
我们来测试一下:
var testData = [43, 2, 57, 42, 17];
var test= d3.selectAll(".test")
.data(testData)
.enter()
.append("p");
test.attr("foo", function(foo, bar) { console.log("Data: " + JSON.stringify(foo), "\nIndex: " + JSON.stringify(bar))
})
<script src="https://d3js.org/d3.v4.min.js"></script>