¿Por qué CoffeeScript envuelve las definiciones de clase en un cierre?

En CoffeeScript,esta:

class Foo
  method: (x) ->
    x+1

Compila a:

// Generated By CoffeeScript
Foo = (function() {
  function Foo() {}
  Foo.prototype.method = function(x) {
    return x+1;
  }
  return Foo;
})()

Lo que parece un poco excesivo. Lo siguiente debe serfuncionalmente idéntico:

// Generated by Dave
function Foo() {}
Foo.prototype.method = function(x) {
    return x+1;
}

¿Cuál es la motivación para la envoltura extra de "cierre"?

Esto no es simplemente una cuestión ociosa de estilo; tiene implicación al tamaño total del código.

La versión de Café se reduce a 84 bytes:

Foo=function(){function e(){}return e.prototype.method=function(e){return e+1},e}();

Mi versión se reduce a solo 61 bytes:

function Foo(){}Foo.prototype.method=function(e){return e+1};

23 bytes son tipos tontos de irrelevantes, pero en un proyecto con muchas clases, la sobrecarga comienza a acumularse.

Ok, escribí una respuesta a continuación refutando la teoría del tamaño de bytes ... Para cualquier clase razonable, el método del café será más pequeño.

Probablemente hay otras razones también. Ayúdame a pensar en ellos.

Respuestas a la pregunta(4)

Su respuesta a la pregunta