I notice that in CoffeeScript, if I define a function using:
a = (c) -> c=1
I can only get the function expression:
var a;
a = function(c) {
return c = 1;
};
But, personally I often use function declaration,for example:
function a(c) {
return c = 1;
}
I do use the first form, but I'm wondering if there is a way in CoffeeScript generating a function declaration. If there is no such way, I would like to know why CoffeeScript avoid doing this. I don't think JSLint would holler an error for declaration, as long as the function is declared at the top of the scope.
CoffeeScript uses function declarations (aka "named functions") in just one place: class
definitions. For instance,
class Foo
compiles to
var Foo;
Foo = (function() {
function Foo() {}
return Foo;
})();
The reason CoffeeScript doesn't use function declarations elsewhere, according to the FAQ:
Blame Microsoft for this one. Originally every function that could have a sensible name retrieved for it was given one, but IE versions 8 and down have scoping issues where the named function is treated as both a declaration and an expression. See this for more information.
In short: Using function declarations carelessly can lead to inconsistencies between IE (pre-9) and other JS environments, so CoffeeScript eschews them.