This code
nums = [1..10].map (i) -> i*2
Runs
Whereas this
nums = [1..10].map(i) -> i*2
is broken
The reason for this is that parentheses for a function call (invocation) are optional. I find this a constant confusion in my own code and have a general policy of always including parentheses to make it clear.
In coffee script, if you leave out the parentheses it assumes that the argument list goes to the end of the line. Your first example coffee script is actually the same as this:
nums = [1..10].map((i) -> i*2)
where the first argument of the call to map is a function (i)->i*2
If you remove the space between the map and the (i) then coffee script implies parentheses around the rest of the line. Your second example coffee script is actually the same as this:
nums = [1..10].map(i)(-> i*2)
Here you can see that map is being called with i
as the only argument and then coffee script is expecting the map(i)
call to return a function which is then being called passing ->i*2
or to be more explicit ()->i*2
as an argument.
Given that coffee script is designed to remove the potential coding hazards of javascript, I think that it would have been much safer if they had not included this implied parenthesis.
The map(i)
in the second one is interpreted as a function call. The JavaScript comes out like this:
var nums;
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(i)(function() {
return i * 2;
});
and that doesn't make any sense because map
doesn't return a function and there is no i
defined.
In the first one, the space turns it into [1..10].map((i) -> i*2)
so you end up calling map
with a function as an argument; the JavaScript in this case looks like this:
var nums;
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(function(i) {
return i * 2;
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With