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