2011-11-23 12 views
5

¿Es el segundo mejor que el primero?¿Es mejor definir vars fuera de los bucles?

PRIMERO:

var count:int=myArray.length; 
for(var i:uint=0;i<count;i++) 
{ 
    var str:String=myArray[i].label; 
    var somethingElse:Class=...; 
    var andAnotherThing:MyInstance=new MyInstance(somethingElse); 
    ... 
} 

SEGUNDO:

var count:int=myArray.length; 
var str:String; 
var somethingElse:Class; 
var andAnotherThing:MyInstance; 
for(var i:uint=0;i<count;i++) 
{ 
    str=myArray[i].label; 
    somethingElse=...; 
    andAnotherThing=new MyInstance(somethingElse); 
    ... 
} 

Gracias.

+2

+1 Gran pregunta ... como inicialmente pensé que esto era obvio, pero me di cuenta rápidamente a través de las otras respuestas que está lejos de ser obvio – Chris

Respuesta

7

En Actionscript y Javascript, las variables se asignan a la función, no al bloque. Se llama elevación variable.

ActionScript 3.0 Variables

Una consecuencia interesante de la falta de alcance a nivel de bloque es que se puede leer o escribir en una variable antes de ser declarado, siempre y cuando se declara antes de que termine la función. Esto se debe a una técnica llamada elevación, lo que significa que el compilador mueve todas las declaraciones de variables a la parte superior de la función.

tan eficazmente su código se comportará como éste, independientemente de donde se declara las variables dentro de la función:

var count:int; 
var str:String; 
var i:uint; 
var somethingElse:Class; 
var andAnotherThing:MyInstance; 

count = myArray.length; 
for(i=0;i<count;i++) 
{ 
    str=myArray[i].label; 
    somethingElse = ...; 
    andAnotherThing = new MyInstance(somethingElse); 
    ... 
} 

Sin embargo, yo prefiero hablar de mis variables dentro de los bloques que los utilizan principalmente para el mantenimiento razones y claridad general.

+0

Ah, entonces no se vuelven a declarar en cada ciclo, ¿verdad? – Francisc

+1

@Francisc No, no lo son, está configurando la misma variable para cada iteración del ciclo. Puede verificar esto en el depurador, verá que las variables contendrán los valores previos al comienzo de cada iteración. – Peter

+0

Genial, gracias de nuevo. – Francisc

2

En Flash, la respuesta es que no importa. Flash es raro cuando se trata de declaración de variables. Haga lo siguiente y ver lo que sucede:

for(var i:uint=0;i<count;i++) 
{ 
    var str:String=myArray[i].label; 
    var somethingElse:Class=...; 
    var andAnotherThing:MyInstance=new MyInstance(somethingElse); 
} 
var str:String=myArray[i].label; 

Aunque str corrió fuera de alcance del bucle, recibirá una advertencia redefinición variables, lo que significa que la variable sólo se "inicializa" una vez en una en bucle;

+0

Gracias, Felipe. – Francisc

1

En ActionScript 3 No creo que realmente importe. Creo que en otros lenguajes, los bucles tienen su propio alcance, lo que significa que las variables definidas dentro de ellos no son accesibles fuera del ciclo.

Creo que la única diferencia en AS3 es cómo afecta la legibilidad. En mi opinión, el primer ejemplo es mucho más agradable.

Previamente a menudo define el iterador por encima del bucle por motivos de legibilidad, así:

var i:MovieClip; 
for each(i in movieClipArray) 
{ 
    trace(i); 
} 

Pero como entrar en una variedad de idiomas, he guardado todo lo que contenía la consistencia:

for each(var i:MovieClip in movieClipArray) 
{ 
    trace(i); 
} 
+0

Gracias, Marty. – Francisc

2

ActionScript no da a los bloques de ejecución (como un bloque for) su propio alcance, a diferencia de algunos otros idiomas. El alcance más pequeño para la variable es una función. Entonces, para el compilador, ambos ejemplos son los mismos. De hecho, la implementación es una técnica llamada "elevación variable", donde el compilador mueve la declaración de la variable antes del comienzo del alcance.

Esto tiene algunos efectos secundarios interesantes, aunque inesperados; efectivamente puede "usar" una variable antes de que haya sido "declarada". Por ejemplo:

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

Observe que la primera traza no falla.

De todos modos, la clave para recordar es que las variables tienen un alcance local para las funciones. Esto es especialmente importante cuando se trata de cierres.

+0

Buena idea, gracias chico de 32 bits. – Francisc

Cuestiones relacionadas