此代码
nums = [1..10].map (i) -> i*2
奔跑
而这
nums = [1..10].map(i) -> i*2
坏了
答案 0 :(得分:6)
原因是函数调用(调用)的括号是可选的。我发现这在我自己的代码中始终存在混淆,并且总体上包含括号的一般政策,以便明确。
在咖啡脚本中,如果省略括号,则假定参数列表到达行尾。您的第一个示例咖啡脚本实际上与此相同:
nums = [1..10].map((i) -> i*2)
其中map的调用的第一个参数是函数(i)->i*2
如果你删除地图和(i)之间的空格,那么咖啡脚本意味着围绕其余部分的括号。您的第二个示例咖啡脚本实际上与此相同:
nums = [1..10].map(i)(-> i*2)
在这里你可以看到正在使用i
作为唯一参数调用map,然后coffee脚本期望map(i)
调用返回一个函数,然后调用该函数传递->i*2
或者更明确()->i*2
作为论据。
鉴于咖啡脚本旨在消除javascript的潜在编码危害,我认为如果他们没有包含这个隐含的括号,它会更安全。
答案 1 :(得分:4)
第二个中的map(i)
被解释为函数调用。 JavaScript出现如下:
var nums;
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(i)(function() {
return i * 2;
});
这没有任何意义,因为map
没有返回函数,也没有定义i
。
在第一个空格中,空格将其变为[1..10].map((i) -> i*2)
,因此您最终以函数作为参数调用map
;这种情况下的JavaScript看起来像这样:
var nums;
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(function(i) {
return i * 2;
});