JavaScript para Titanium (I)

JavaScript para Titanium (I)

Si estás empezando a trabajar con Titanium, lo mejor que puedes hacer antes de embarcarte en un proyecto real es adquirir una BUENA base de JavaScript.

Lo mejor y lo peor de JavaScript es que lo aguanta todo. Puedes olvidarte de declarar las variables, no usar punto y coma al final de línea y ser un desastre organizando el código. Es posible que, incluso así, el código funcione. Pero pobre del que tenga que revisar tu código, incluso si eres tú mismo, cuando algo deje de funcionar.

No me gusta convencer a la gente de que haga cosas sólo por miedo a que algo terrible ocurra (en este caso, el miedo a que algún día nuestro código sea un desastre). Y, aunque es un argumento de peso, JavaScript tiene bastantes alicientes como para motivar su aprendizaje a fondo sin otro objetivo que crear grandes aplicaciones y aprovechar al 100% las características del lenguaje.

JavaScript es un gran lenguaje de programación, a menudo incomprendido, porque ha sido el lenguaje que a movido la web durante años con tantos sabores como navegadores en el mercado. Quizá por eso mi primer consejo al empezar con Titanium es olvidarse del DOM, de JQuery y cualquier otro framework y forma de programar orientada a la web. Titanium no se ejecuta en una ventana de navegador, por tanto estamos hablando de JavaScript “puro”, ampliado y mejorado con la API de titanium, desarrollada en el código nativo de cada plataforma. Por eso Titanium es único, porque realmente ejecuta código nativo, que es llamado desde el intérprete JavaScript.

Este artículo pretende mostrar las “mínimas” cosas que uno debe saber de JavaScript, especialmente cuando viene de trabajar con otros lenguajes.

Lo mas basico

Tipos

Las variables no se declaran con un tipo específico y pueden cambiar de tipo durante su vida (pueden crearse siendo string y luego asignar un valor numérico sin hacer ningún tipo de cast).

Las cadenas se pueden delimitar con comillas simples y dobles indistintamente. Es exactamente lo mismo.

La mayoría de tipos (strings, arrays, objects…) son objetos. Así, al declarar una variable string como  var str = "hola", ya podemos hacer uso de sus métodos y propiedades. Por ejemplo str.length devolverá el valor 4.

Para declarar cualquier tipo de variable (sea array, string o cualquier otro tipo), utilizamos la palabra var. En aplicaciones como las que haremos con Titanium debemos obligarnos a declarar siempre las variables ya que, de no hacerlo, éstas se crean con alcance global (y como ya puedes intuir esto es malo, malo). Que estén en global significa que nunca se liberan de memoria y que pueden llegar a colisionar con otras variables, creando aplicaciones muy difíciles de trazar.

Los números en JavaScript siempre son tratados internamente en coma flotante. Las variables numéricas por defecto están “unboxed” lo que quiere decir que no podemos tratarlas como objetos. Para tratarlas como objeto crearemos con el operador new. Ocurre lo mismo con los booleanos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Unboxed: valor

var x = 5;

x.foo = ’bar’;   // Esto falla “en silencio”

x.foo            // undefined;

//Boxed: referencia

var x = new Number (5);

x.foo = ’bar’;

x.foo            //’bar’; x es un puntero (una referencia, no un valor)

Los arrays son muy flexibles, puedes crear arrays mezclando distintos tipos de variables, añadir índices en cualquier posición.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var arr = [];

var otroArr = [1, 5, "una cadena", {x:2, y:10}]; //puedes combinar cualquier tipo de contenido en un array

arr[0] = “hola”;

arr[1] = “adiós”;

arr[15] = “ciao”;

arr.push (“buenos días); //añade al final

arr.unshift (“buenas noches”); //añade al principio

//recorre todo el array

for(var i = 0, j = arr.length; i < j; i++){

Ti.API.info(arr[i]);

}

Comparaciones

Lo que en otros lenguajes se compara con == ó != (dos caracteres) en JavaScript se hace con tres (=== y !==). Este es uno de los errores de principiante más comunes al empezar con JavaScript. Así que siempre hay que utilizar el comparador ternario (el de tres caracteres), a menos que sepas lo que estás haciendo. Como ejemplo de los líos en los que nos podemos meter, en JavaScript todas las siguientes sentencias son TRUE (en la mayoría de lenguajes serían FALSE):

1
2
3
4
5
6
null==0
false==’’
’’==0
true==1
true==1
1==1

Usando la comparación === hubieran dado false como resultado, que es lo que esperaríamos en la mayoría de casos.

Ambito y declaracion de variables

En JavaScript el ámbito de una variable es el de la función en la que es declarada. Si la variable no se declara dentro de una función, entonces se trata de una variable global. Esto puede llegar a ser un serio problema, ya que JavaScript permite usar variables sin declarar, lo que hace que se vayan cargando siempre al ámbito global de ejecución y por tanto nunca se liberen de la memoria. ¿Cómo resolver esto?

    • Primero: siempre declara las variables con la palabra clave var. Acostúmbrate a hacerlo. Siempre.
    • Segundo: Dado que las variables tienen como ámbito la función que la contiene, da igual que la declares dentro de un bloque if, o dentro de un bucle for o cualquier otro sitio. Esa variable siempre existe desde el principio de la función y seguirá existiendo al terminar el bloque If o el bucle for. Por tanto, es una buena idea declarar siempre las variables al comienzo de la función y no a lo largo de la misma.
    • Tercero: restringe el uso de las variables globales. Más adelante hablaremos de los módulos CommonJS como forma de organizar el código. Valga decir que SI es posible crear aplicaciones con cero variables globales y este será nuestro objetivo.
    • Cuarto: podemos usar objetos como contenedores de variables para agrupar aquellas con una utilidad común. Por ejemplo, podemos tener un objeto “config” que contenga las variables de configuraciones de la aplicación:
1
2
3
4
5
var config = {
title:'My app',
support:'info@myapp.com',
defaultTheme:'white'
};

(más adelante hablaremos de los objetos en JavaScript)
::

En muchos lenguajes el ámbito de las variables está delimitado por bloques y esperamos este comportamiento, pero en JavaScript no ocurre así. Recuérdalo cuando hagas algo como esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function miFuncion(){

for(var i = 0; i < 10; i++){

}

//aquí i sigue existiendo y vale 10

if(true){

var j = 15;

}

//Aquí j sigue existiendo y vale 15;

}

//Aquí no existe i ni j

 

Punto y coma

En JavaScript no es obligatorio usar punto y coma ; al final de todas las sentencias.  Hay un montón de gente que le encanta discutir sobre si, siendo algo opcional, debe usarse o no.

Mi opinión: debe usarse siempre. Además de que no cuesta nada y que ayuda visualmente a la lectura, hay un argumento de peso. Ayuda al intérprete de JavaScript a determinar cuando ha terminado una sentencia y empieza la siguiente, lo que en casos extremos puede evitar errores muy difíciles de detectar porque el intérprete JavaScript está entendiendo algo distinto a lo que nosotros creemos que debería hacer. Usa el punto y coma. Siempre. Asunto resuelto.

 

Continuar con el siguiente artículo de la serie >

¿Te interesa Titanium y JavaScript? Sígueme en @jrayon

1
  1. Samuel Olivera says

    Buenos días Javier,
    Estoy interesado en crear Apps, y Appcelerator me parece la opción más interesante. El problema es que mis conocimientos de Javascript son practicamente nulos, y los libros que veo por ahí lo enfocan a la web. Me´gustaría que me recomendaras algún libro en el que pudiera aprender bien js y poder meterme luego con Titanium.
    Gracias de antemano, un saludo
    Samuel

Oops, our twitter feed is unavailable right now. Follow us on Twitter