Question

Lors de l'utilisation CFML et CF9 je généralement var portée mes variables de boucle; dans ce local.i cas, par exemple:

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

J'ai récemment commencé à convertir des trucs en CFScript, et (à ma grande déception, j'ai découvert qu'il n'y a aucun moyen de boucle sur une liste CFScript) Je me demande si je dois encore var champ mes variables de boucle, et comment:

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

dois-je faire local.i = 1 et local.i = local.i + 1 istead du code exemple dans mon exemple? Est-il nécessaire?

EDIT : Je voudrais également demander si la forme CFScript de ma boucle CFML est correcte; Je demande parce que je viens de remarquer que ma boucle CFML utilise un , (virgule et espace) pour l'argument delimiter, qui semble non-existence dans la version CFScript de la boucle.

Était-ce utile?

La solution

Toutes les fonctions utilisent encore la portée des variables par défaut si vous ne spécifiez pas, ce qui rendrait l'omettre non-thread-safe. Où que vous devez avoir préalablement utilisé var vous devez maintenant utiliser local.

En ce qui concerne le séparateur virgule + espace, deux choses:

  1. Si vous n'êtes pas au courant, l'argument delimiters de la fonction de liste n'est pas pour délimiteurs multi-caractères, il est pour plusieurs délimiteurs; de sorte que votre liste sera divisée pour chaque occurrence d'une virgule, ainsi que chaque occurrence d'un espace.

  2. Vous utilisez le même argument dans le cadre de vos méthodes de listLen et listGetAt, comme suit:

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

Autres conseils

Vous avez certainement besoin d'utiliser la portée locale comme le dit Adam, mais dans le cas des boucles Je pense qu'il ya un cas fort pour utiliser le mot-clé « var » plutôt que le préfixe « local » par souci de lisibilité. Avec CF9 vous n'êtes plus obligé de placer des déclarations var en haut de la fonction, donc tout ce que vous devez faire est d'ajouter « var » à votre « pour » déclaration condition pour tout l'indice « i » variables pour devenir thread-safe.

La prise en bon point de Ben de sauver la longueur de la liste avant de commencer la boucle, et en utilisant le plus concis i ++ le style incrémenter votre code serait:

var listLength  =   ListLen( this.list );
for (var i = 1; LTE listLength; i++ ) {
    if (Len(ListGetAt(this.list, i) GT 10)) {
    // do something
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top