JavaScript WTFs - ydarias/CoffeeScriptTutorial GitHub Wiki
ESTE ARTÍCULO ESTÁ EN PROGRESO ... AÚN FALTA CONTENIDO
Para aquellas personas que están empezando con JavaScript, el libro de Douglas Crockford, JavaScript: The Good Parts es una referencia obligatoria. Dicho libro contiene dos apéndices en los que se habla de aspectos negativos que tiene el lenguaje, pero por suerte para nosotros, algunos de estos aspectos han sido corregidos en CoffeeScript.
Estas son las partes que se destacan como molestas, aunque necesarias, pero que pueden solventarse de alguna manera.
Los lenguajes de programación a los que generalmente estamos acostumbrados suelen tener ámbitos en los que se definen el alcance de las variables utilizadas. En el caso de JavaScript cuando una variable no está dentro de una función tiene ámbito global, por lo que se pueden producir colisiones y sobre-escrituras no deseadas.
La forma más sencilla de evitar dicho comportamiento es utilizando las clausuras, como hacen muchas librerías JavaScript existentes, por ejemplo jQuery.
(function (arguments) { // cualquier variable que utilicemos en este ámbito NO será global })();
De esta manera podemos simular el uso de variables y funciones privadas, de manera similar a como se trabaja en Java o C# entre otros.
Con CoffeeScript no nos tenemos que preocupar por este comportamiento, ya que por defecto el código generado por CoffeeScript envuelve nuestras sentencias en una clausura.
helloWorld.coffee
alert "Hello world!"
helloWorld.js
// Generated by CoffeeScript 1.3.3 (function() { alert("Hello world!"); }).call(this);
A diferencia de otros lenguajes, JavaScript no crea un nuevo ámbito con el uso de { } dentro de una misma función, de forma que todas las variables declaradas en la misma son accesibles. Estaremos acostumbrados a declarar las variables justo antes de utilizarlas, pero con JavaScript es mejor declarar todas las variables a utilizar en la función, justo al principio de esta.
CoffeeScript toma medidas al respecto y declara por nosotros todas las variables al principio de la función, independientemente de donde hayamos realizado la primera referencia a las mismas.
scope.coffee
a = false if (a) b = 1 else b = 2 show = true alert b if show
scope.js
// Generated by CoffeeScript 1.3.3 (function() { var a, b, show; a = false; if (a) { b = 1; } else { b = 2; } show = true; if (show) { alert(b); } }).call(this);
Nota: Al realizar este paso de forma automática se asegura que siempre se está haciendo uso de la palabra reservada var y no se están declarando variables globales por error.
JavaScript al igual que otros muchos lenguajes, utiliza el punto y coma (;) para separar sentencias. Pero en el caso de no escribirlo, por defecto, intenta ser inteligente y completa las sentencias en las que considera que llevan un punto y coma al final.
El caso más general en el que esto puede llevar a un problema es cuando nos encontramos con una sentencia return.
return { name: 'myName }
En este sencillo ejemplo se considera que devuelve return ;
, es decir que el return es undefined cuando se pretendía que fuese { name: 'myName }
. En el caso de CoffeeScript, se evita el uso de punto y coma, el compilador los genera por nosotros, y se utiliza como sentencia de retorno la última sentencia de la función.
myFunction.coffee
myFunction = (input) -> output = "This is my " + input output
myFunction.js
// Generated by CoffeeScript 1.3.3 (function() { var myFunction; myFunction = function(input) { var output; output = "This is my " + input; return output; }; }).call(this);
Estas son las partes que Douglas Crockford recomienda evitar a toda costa.