Apuntes de Javascript
Traducción/resumen de Common JavaScript “Gotchas”. A mí me ha resultado útil para no terminar con una empanada monumental.
La palabra clave var
var
declara una variable y siempre debería usarse puesto que en otro caso la variable se declarará goblamente.
¡Siempre usar var para declarar variables!
¿Porqué hay tantas formas de definir una función? ¿Cuáles son las diferencias?
Encontraremos tres formas comunes de definir una función:
myFunction1 = function(arg1, arg2) {}; // NEVER do this!
function myFunction2(arg1, arg2) {}; // This is OK, but...
var myFunction3 = function(arg1, arg2) {}; // This is best!
La primera define la función y la asigna a una variable globalmente. Tal vez no es lo que deseamos.
La segunda tiene el scope adecuado pero tenemos que tener en cuenta las closures.
La tercera es la mejor ya que es sintácticamente consistente con el punto anterior y no pone la función en el scope global. Incluso podemos mejorarla con
var myFunction5 = function aDifferentName(arg1, arg2) {};
console.log(myFunction5.name); // logs "aDifferentName"
En este caso, name
queda definido al nombre de la función lo que puede ser útil para hacer debug y mejora la claridad del código.
La palabra clave this
: Cómo se comporta?
Generalmente, no es necesario usar this
ya que no se comporta como en el resto de lenguajes OOP. En este sentido, es recomendable seguir el patrón module.
La palabra clave this
es un puntero al contexto de ejecución actual. Con un ejemplo se ve mejor:
var myFunction = function()
{
console.log(this);
};
var someObject = {}; // Create an empty object. Same as: new Object();
someObject.myFunction = myFunction; // Give someObject a property
someObject.myFunction(); // Logs Object
myFunction(); // Logs...Window?
La primera llamada logea el objeto someObject porque se ejecuta en el contexto de este. Sin embargo, en la segunda llamada myFunction();
se ejecuta desde el contexto de la raiz del navegador y por eso logea el objeto `window’.
Lo importante es recordar que
this
apunta a lo que sea que haya “a la izquierda del punto”.
Qué demonios es una closure?
Es una característica del lenguaje que permite que una variable no se destruya si su valor podría ser requerido en el futuro. Esto es necesario en el manejo de eventos.
Supongamos este código:
// When someone clicks a button, show a message.
var setup = function()
{
var clickMessage = "Hi there!";
$('button').click
(
function()
{
window.alert(clickMessage);
}
);
};
setup();
En un leguaje sin closures, lo más probable es que la variable clickMessage ya no existiera en el momento en que el usuario pulsara el botón. Pero Javascript “sabe” que debe mantener la variable.
Pero es que aún podemos llegar un poco más lejos con algo como esto:
(function()
{
var clickMessage = "Hi there!";
$('button').click
(
function()
{
window.alert(clickMessage);
}
);
})();
En este ejemplo ni siquiera tenemos que dar nombre a la función. Como quiera que hemos terminado el código con ()
se ejecutará una vez y ya podemos olvidarnos de él con la certeza de que todo lo declarado dentro existirá en el momento en que el usuario haga click.