Variables

Las variables permiten almacenar los valores que se utilizan en el programa. Para declarar una variable se debe utilizar la sentencia var con el nombre de variable. En ActionScript 3.0, el uso de la sentencia var es siempre obligatorio. Por ejemplo, la línea siguiente de código ActionScript declara una variable denominada i:

var i;

Si se omite la sentencia var al declarar una variable, se producirá un error del compilador en modo estricto y un error en tiempo de ejecución en modo estándar. Por ejemplo, la siguiente línea de código producirá un error si la variable i no se ha definido previamente:

i; // error if i was not previously defined

La asociación de una variable con un tipo de datos, debe realizarse al declarar la variable. Es posible declarar una variable sin designar su tipo, pero esto generará una advertencia del compilador en modo estricto. Para designar el tipo de una variable se añade el nombre de la variable con un signo de dos puntos (:), seguido del tipo de la variable. Por ejemplo, el código siguiente declara una variable i de tipo int:

var i:int;

Se puede asignar un valor a una variable mediante el operador de asignación (=). Por ejemplo, el código siguiente declara una variable i y le asigna el valor 20:

var i:int; 
i = 20;

Puede ser más cómodo asignar un valor a una variable a la vez que se declara la variable, como en el siguiente ejemplo:

var i:int = 20;

La técnica de asignar un valor a una variable en el momento de declararla se suele utilizar no sólo al asignar valores simples, como enteros y cadenas, sino también al crear un conjunto o una instancia de una clase. En el siguiente ejemplo se muestra un conjunto que se declara y recibe un valor en una línea de código.

var numArray:Array = ["zero", "one", "two"];

Para crear una instancia de una clase hay que utilizar el operador new. En el ejemplo siguiente se crea una instancia de una clase denominada CustomClass y se asigna una referencia a la instancia de clase recién creada a la variable denominada customItem:

var customItem:CustomClass = new CustomClass();

Si hubiera que declarar más de una variable, se pueden declarar todas en una línea de código utilizando el operador coma (,) para separar las variables. Por ejemplo, el código siguiente declara tres variables en una línea de código:

var a:int, b:int, c:int;

También se puede asignar valores a cada una de las variables en la misma línea de código. Por ejemplo, el código siguiente declara tres variables (a, b y c) y asigna un valor a cada una de ellas:

var a:int = 10, b:int = 20, c:int = 30;

Aunque se puede utilizar el operador coma para agrupar declaraciones de variables en una sentencia, al hacerlo el código será menos legible.

Aspectos básicos del ámbito de variables

El ámbito de una variable es el área del código en la que se puede acceder a la variable mediante una referencia léxica. Una variable global está definida en todas las áreas del código, mientras que una variable local sólo está definida en una parte del código. En ActionScript 3.0, las variables siempre se asignan al ámbito de la función o la clase en la que se han declarado. Una variable global es una variable que se define fuera de una definición de función o clase. Por ejemplo, el código siguiente crea una variable global strGlobal declarándola fuera de las funciones. El ejemplo muestra que una variable global está disponible tanto dentro como fuera de una definición de función.

var strGlobal:String = "Global"; 
function scopeTest() 
{ 
    trace(strGlobal); // Global 
} 
scopeTest(); 
trace(strGlobal); // Global

Las variables locales se declaran dentro de una definición de función. La parte más pequeña de código para la que se puede definir una variable local es una definición de función. Una variable local declarada en una función sólo existirá en esa función. Por ejemplo, si se declara una variable denominada str2 dentro de una función denominada localScope(), dicha variable no estará disponible fuera de la función.

function localScope() 
{ 
    var strLocal:String = "local"; 
} 
localScope(); 
trace(strLocal); // error because strLocal is not defined globally

Si el nombre de la variable que utiliza para la variable local ya se ha declarado como variable global, la definición local oculta (o reemplaza) la definición global mientras la variable local se encuentre dentro del ámbito. La variable global continuará existiendo fuera de la función. Por ejemplo, el siguiente fragmento de código crea una variable de cadena global denominada str1 y a continuación crea una variable local con el mismo nombre dentro de la función scopeTest(). La sentencia trace de la función devuelve el valor local de la variable, pero la sentencia trace situada fuera de la función devuelve el valor global de la variable.

var str1:String = "Global"; 
function scopeTest () 
{ 
    var str1:String = "Local"; 
    trace(str1); // Local 
} 
scopeTest(); 
trace(str1); // Global

Las variables de ActionScript, a diferencia de las variables de C++ y Java, no tienen ámbito a nivel de bloque. Un bloque de código es un grupo de sentencias entre una llave inicial ({) y una llave final (}). En algunos lenguajes de programación, como C++ y Java, las variables declaradas dentro de un bloque de código no están disponibles fuera de ese bloque de código. Esta restricción de ámbito se denomina ámbito a nivel de bloque y no existe en ActionScript. Si se declara una variable dentro de un bloque de código, dicha variable no sólo estará disponible en ese bloque de código, sino también en cualquier otra parte de la función a la que pertenece el bloque de código. Por ejemplo, la siguiente función contiene variables definidas en varios ámbitos de bloque. Todas las variables están disponibles en toda la función.

function blockTest (testArray:Array) 
{ 
    var numElements:int = testArray.length; 
    if (numElements > 0) 
    { 
        var elemStr:String = "Element #"; 
        for (var i:int = 0; i < numElements; i++) 
        { 
            var valueStr:String = i + ": " + testArray[i]; 
            trace(elemStr + valueStr); 
        } 
        trace(elemStr, valueStr, i); // all still defined 
    } 
    trace(elemStr, valueStr, i); // all defined if numElements > 0 
} 
 
blockTest(["Earth", "Moon", "Sun"]);

Una consecuencia interesante de la falta de ámbito a nivel de bloque es que se puede leer el valor de una variable o escribir en ella antes de que se declare, con tal de que se declare antes del final de la función. Esto se debe a una técnica denominada hoisting, que consiste en que el compilador mueve todas las declaraciones de variables al principio de la función. Por ejemplo, el código siguiente se compila aunque la función trace() inicial para la variable num está antes de la declaración de la variable num:

trace(num); // NaN 
var num:Number = 10; 
trace(num); // 10

Sin embargo, el compilador no mueve ninguna sentencia de asignación al principio. Esto explica por qué la función trace() inicial de num devuelve NaN (no es un número), que es el valor predeterminado para variables con tipo de datos Number. Así, es posible asignar valores a variables incluso antes de declararlas, como se muestra en el siguiente ejemplo:

num = 5; 
trace(num); // 5 
var num:Number = 10; 
trace(num); // 10

Valores predeterminados

Un valor predeterminado es el valor que contiene una variable antes de que se establezca su valor. Una variable se inicializa al establecer su valor por primera vez. Si se declara una variable pero no establece su valor, dicha variable estará sin inicializar. El valor de una variable no inicializada depende del tipo de datos que tenga. En la tabla siguiente se describen los valores predeterminados de las variables, clasificados por tipo de datos:

Tipo de datos

Valor predeterminado

Boolean

false

int

0

Number

NaN

Object

null

String

null

uint

0

No declarada (equivalente a anotación de tipo *)

undefined

Todas las demás clases, incluidas las clases definidas por el usuario.

null

Para variables de tipo Number, el valor predeterminado es NaN (no es un número), que es un valor especial definido por la norma IEEE-754 para designar un valor que no representa un número.

Si se declara una variable pero no se declara su tipo de datos, se aplica el tipo de datos predeterminado, *, que en realidad indica que la variable no tiene tipo. Si tampoco se inicializa una variable sin tipo con un valor, su valor predeterminado será undefined.

Para tipos de datos distintos de Boolean, Number, int y uint, el valor predeterminado de cualquier variable no inicializada es null. Esto se aplica a todas las clases definidas mediante ActionScript 3.0, así como a las clases personalizadas que se creen.

El valor null no es válido para variables de tipo Boolean, Number, int o uint. Si se intenta asignar el valor null a una variable de este tipo, dicho valor se convierte en el valor predeterminado para ese tipo de datos. A las variables de tipo Object se les puede asignar un valor null. Si se intenta asignar el valor undefined a una variable de tipo Object, dicho valor se convierte en null.

Para variables de tipo Number, hay una función especial de nivel superior denominada isNaN() que devuelve el valor booleano true si la variable no es un número, y false en caso contrario.