为什么CoffeeScript在地图后需要空白?

时间:2012-01-26 07:19:34

标签: coffeescript

此代码

nums = [1..10].map (i) -> i*2

奔跑

而这

nums = [1..10].map(i) -> i*2

坏了

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;
});