2011-01-06 5 views
7

Bei der Verwendung von CFML und CF9 Variabler Bereich normalerweise meine Schleife Variablen; in diesem Fall local.i, zum Beispiel:Ist es erforderlich, in CFScript Variablenvariablenvariablen zu varieren?

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

ich ein paar Sachen in CFScript kürzlich Umwandlung begonnen, und (zu meiner Enttäuschung fand ich heraus, dass es keine Möglichkeit, eine Schleife über eine Liste in CFScript ist) Ich frage mich, wenn ich soll noch meine Schleife Variablen var Umfang und wie:

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

soll ich tun local.i = 1 und local.i = local.i + 1 istead des Beispielcodes in meinem Beispiel sein? Ist es nötig?

BEARBEITEN: Ich sollte auch fragen, ob die CFScript-Form meiner CFML-Schleife korrekt ist; Ich frage, weil ich gerade bemerkt habe, dass meine CFML-Schleife ein , (Komma und Leerzeichen) für das delimiter Argument verwendet, das in der CFScript-Version der Schleife nicht vorhanden scheint.

+1

Eine Sache mag ich anmerken - Es sei denn, Sie " etwas tun "kann die Länge Ihrer Liste ändern, ich würde es in einer Variablen speichern und dazu führen. Mein Verständnis ist, dass die Art und Weise, wie Sie dies geschrieben haben, die listlen() Operation für jede Schleife aufgerufen wird. –

Antwort

6

Alle Funktionen verwenden standardmäßig noch den Variablenbereich, wenn Sie keinen angeben, wodurch dieser nicht threadsicher wird. Wo immer Sie zuvor var hätten verwenden sollen, sollten Sie jetzt local verwenden.

Was das Komma + Leerzeichen Trennzeichen, zwei Dinge:

  1. Falls Sie nicht wissen, ist das Trennzeichen Argument der Listenfunktion nicht für Multi-Zeichenbegrenzern, es für mehrere Trennzeichen ist; So wird Ihre Liste für jedes Vorkommen eines Kommas sowie jedes Auftreten eines Leerzeichens geteilt.

  2. Sie verwenden das gleiche Argument als Teil Ihrer listLen und listGetAt Methoden, etwa so:

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

danke! Nur um klar zu sein, wenn Sie sagen, dass "UDFs immer noch den Variablenbereich verwenden" - schließt diese Definition alle Funktionen ein, die ich selbst in meiner CFC-Komponente deklariert habe? – Mohamad

+1

Nein, jede Methode in einem CFC wird standardmäßig auf den lokalen Bereich angewendet. Die UDFs, auf die ich mich bezog, wären irgendwo anders (zB benutzerdefinierte Tags, cfm-Vorlagen usw.). –

+2

Unscoped-Variablen sind standardmäßig auf den Variablenbereich gesetzt. Daher sollten Sie sicherstellen, dass Sie alle lokalen Variablen entweder mit dem neuen "local" definieren "Bereich oder mit dem Schlüsselwort" var ". –

5

Sie müssen auf jeden Fall den lokalen Bereich verwenden, wie Adam sagt, aber im Fall von Schleifen Ich denke, es gibt einen starken Grund für die Verwendung des Schlüsselworts "var" anstelle des Präfix "local" aus Gründen der Lesbarkeit. Mit CF9 sind Sie nicht mehr gezwungen, var-Deklarationen am Anfang der Funktion zu platzieren. Sie müssen lediglich "var" zu Ihrer "for" -Bedingungserklärung für alle Variablen des Index "i" hinzufügen, um Thread-sicher zu werden.

in Bens guten Punkt Punkt über die Länge der Liste speichern, bevor die Schleife beginnt und mit dem prägnanten i ++ Code erhöht Stil wäre:

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