2011-11-23 10 views
5

Il secondo è migliore del primo?È meglio definire vars al di fuori dei loop?

PRIMO:

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); 
    ... 
} 

SECONDO:

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); 
    ... 
} 

Grazie.

+2

+1 Grande domanda .. come inizialmente pensavo fosse ovvio, ma ho capito rapidamente attraverso le altre risposte che è tutt'altro che ovvio – Chris

risposta

7

In Actionscript e Javascript, le variabili hanno come ambito la funzione, non il blocco. Si chiama sollevamento variabile.

ActionScript 3.0 Variables

Un interessante implicazione della mancanza del campo di applicazione a livello di blocco è che è possibile leggere o scrivere una variabile prima che venga dichiarata, purché viene dichiarata prima della fine della funzione. Ciò a causa di una tecnica denominata sollevamento, che significa che il compilatore sposta tutte le dichiarazioni variabili nella parte superiore della funzione.

Così efficacemente il codice si comporterà come questo indipendentemente da dove si dichiarano le variabili all'interno della funzione:

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); 
    ... 
} 

Tuttavia, continuo a preferire di dichiarare le mie variabili all'interno dei blocchi che li utilizzano principalmente per la manutenzione ragioni e chiarezza generale.

+0

Ah, quindi non sono re-dichiarati su ogni ciclo, giusto? – Francisc

+1

@Francisc No, non lo sono, si imposta la stessa variabile per ogni iterazione del ciclo. Puoi verificarlo nel debugger, vedrai che le variabili conterranno i valori precedenti all'inizio di ogni iterazione. – Peter

+0

Ottimo, grazie ancora. – Francisc

2

Su Flash, la risposta è che non importa. Flash è strano quando si tratta di dichiarazioni variabili. Procedere come segue e vediamo cosa succede:

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; 

Anche se str corse fuori dalla portata fuori del ciclo for, si otterrà un avvertimento ridefinizione variabile, il che significa che la variabile sarà "inizializzata" solo una volta in un per ciclo;

+0

Grazie, Felipe. – Francisc

1

In ActionScript 3 Non penso che importi davvero. Credo in altre lingue, i loop hanno il loro ambito, il che significa che le variabili definite al loro interno non sono accessibili al di fuori del ciclo.

Penso che l'unica differenza in AS3 sia il modo in cui influisce sulla leggibilità. A mio parere, il primo esempio è molto più bello.

precedenza ho spesso definito l'iteratore di sopra del ciclo per scopi di leggibilità, in questo modo:

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

Ma dal momento che entrare in una varietà di lingue, ho tenuto tutto quanto contenuto per la consistenza:

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

Grazie, Marty. – Francisc

2

ActionScript non dà esecuzione blocchi (come un blocco for) proprio ambito, a differenza di altre lingue. L'ambito più piccolo per la variabile è una funzione. Quindi, per il compilatore, entrambi gli esempi sono gli stessi. In effetti, l'implementazione è una tecnica chiamata "sollevamento variabile", in cui il compilatore sposta la dichiarazione della variabile prima dell'inizio dell'ambito.

Questo ha alcuni effetti collaterali interessanti, se inaspettati; puoi effettivamente "usare" una variabile prima che sia "dichiarata". Ad esempio:

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

Si noti che la prima traccia non fallisce.

In ogni caso, la cosa fondamentale da ricordare è che le variabili sono localmente orientate alle funzioni. Questo è particolarmente importante quando si tratta di chiusure.

+0

Buona visione, grazie ragazzino a 32 bit. – Francisc

Problemi correlati