2011-01-06 11 views
7

Quando si usano CFML e CF9 di solito var scope le mie variabili di ciclo; in questo caso local.i, ad esempio:È necessario varare le variabili del ciclo scope in CFScript?

<cfloop list="#this.list#" index="local.i"> 
    <cfif Len(local.i) GT 10> 
    // do something 
    </cfif> 
</cfloop> 

recente ho iniziato a convertire alcune cose in cfscript, e (a mio disappunto ho scoperto che non v'è alcun modo per ciclare su una lista in cfscript) Mi chiedo se dovrei ancora var ambito mio variabili di loop, e come:

for (i = 1; LTE ListLen(this.list); i = i + 1) { 
    if (Len(ListGetAt(this.list, i) GT 10)) { 
    // do something 
    } 
} 

dovrei fare local.i = 1 e local.i = local.i + 1 istead del codice di esempio nel mio esempio? È necessario?

EDIT: Vorrei anche chiedere se il formato CFScript del mio ciclo CFML è corretto; Chiedo perché ho appena notato che il mio ciclo CFML utilizza uno , (virgola e spazio) per l'argomento delimiter, che sembra non esistenza nella versione CFScript del ciclo.

+1

Una cosa che vorrei notare - A meno che il vostro " fare qualcosa "può cambiare la lunghezza della tua lista, la memorizzerei in una variabile e lo farò. La mia comprensione è che il modo in cui hai scritto questo, l'operazione listlen() sarà chiamata per ogni ciclo. –

risposta

6

Tutte le funzioni utilizzano ancora lo scope delle variabili di default se non ne specifichi uno, il che farebbe ometterlo senza thread-safe. Dovunque dovessi aver usato in precedenza var dovresti usare ora local.

Per quanto riguarda la virgola di delimitazione + spazio, due cose:

  1. Nel caso in cui non sono a conoscenza, l'argomento delimitatori della funzione che questo elenco non è per delimitatori multi-carattere, è per più delimitatori; quindi la tua lista sarà divisa per ogni occorrenza di una virgola, così come ogni occorrenza di uno spazio.

  2. si utilizza lo stesso argomento come una parte del tuo listLen e listGetAt metodi, in questo modo:

    for (i = 1; LTE ListLen(this.list, ', '); i = i + 1) { 
        if (Len(ListGetAt(this.list, i, ', ') GT 10)) { 
        // do something 
        } 
    } 
    
+0

grazie! Giusto per essere chiari, quando si dice "UDF usano ancora l'ambito delle variabili" - questa definizione include tutte le funzioni che ho dichiarato nel mio componente CFC? – Mohamad

+1

No, qualsiasi metodo all'interno di un CFC imposterà automaticamente l'ambito locale. Le UDF a cui mi riferivo sarebbero dovunque altrove (es. Tag personalizzato, modello cfm, ecc.) –

+2

Le variabili senza ambito sono impostate come predefinite per l'ambito delle variabili, quindi ti consigliamo di verificare l'ambito di tutte le variabili locali utilizzando il nuovo "locale" "scope o usando la parola chiave" var ". –

5

è sicuramente bisogno di utilizzare l'ambito locale come dice Adam, ma nel caso di loop Penso che ci sia un forte motivo per utilizzare la parola chiave "var" piuttosto che il prefisso "locale" per motivi di leggibilità. Con CF9 non sei più costretto a posizionare dichiarazioni di variabili nella parte superiore della funzione, quindi tutto ciò che devi fare è aggiungere "var" alla tua dichiarazione di condizione "for" per tutte le variabili dell'indice "i" affinché diventino thread-safe.

Prendendo in buon punto di Ben di salvare la lunghezza della lista prima di avviare il ciclo, e utilizzando la più concisa I ++ incremento stile il codice sarebbe:

var listLength = ListLen(this.list); 
for (var i = 1; LTE listLength; i++) { 
    if (Len(ListGetAt(this.list, i) GT 10)) { 
    // do something 
    } 
} 
Problemi correlati