javascriptcoffeescriptjavascript-function-declaration

Function declaration in CoffeeScript


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.


Solution

  • 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.