2011-01-06 4 views
7

CFML과 CF9를 사용할 때 일반적으로 var 변수가 내 루프 변수입니다. 예를 들어,이 경우 local.i에 : 나는 최근 CFScript를에 몇 가지 물건을 변환 시작하고,CFScript에서 var 범위 루프 변수가 필요합니까?

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

나는 궁금 해요 (내 실망 나는 CFScript의에서 목록을 통해 반복 할 수있는 방법이 없다는 것을 발견) 나는 아직도 var에 내 루프 변수 범위, 어떻게해야

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

내가되어야한다 local.i = 1 내 예제의 샘플 코드의 local.i = local.i + 1 istead거야? 그게 필요 할까?

EDIT : CFScript 형식의 CFML 루프가 정확한지 물어보십시오. 방금 CFScript 루프가 delimiter 인수에 , (쉼표와 공백)을 사용한다는 것을 알았 기 때문에 묻습니다. CFScript 버전의 루프에는 존재하지 않는 것처럼 보입니다.

+1

것은 내가주의 것 -하지 않는 한 " 뭔가를 "할 수 있습니다 귀하의 목록의 길이를 변경할 수 있습니다, 나는 그것을 변수에 저장하고 루프. 필자가 생각한대로, 모든 루프마다 listlen() 작업이 호출됩니다. –

답변

6

아무 함수도 지정하지 않으면 모든 함수에서 기본적으로 변수 범위를 사용하므로 스레드 안전하지 않은 함수는 생략하지 않습니다. 이전에 var을 사용했던 곳이면 local을 사용해야합니다. 쉼표 + 공간 구분에 관해서는

은 두 가지 : 당신이 인식하지 못하는 경우

  1. 목록 기능의 구분 기호 인수는 여러 구분 기호입니다, 멀티 문자 분리 문자 아니다; 그래서 목록은 쉼표가 나타날 때마다 나뉘어지며 각 공백이 나타날 때마다 나뉩니다.

  2. 는 당신과 같이 당신의 listLenlistGetAt 방법의 일환으로 같은 인수를 사용

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

감사합니다! "UDF가 여전히 변수 범위를 사용합니다"라고 말할 때 - 그 정의에는 내 CFC 구성 요소에 자신을 선언 한 함수가 포함되어 있습니까? – Mohamad

+1

아니요, CFC 내부의 메소드는 모두 로컬 범위로 기본 설정됩니다. 내가 언급 한 UDF는 다른 곳 (예 : 사용자 정의 태그, cfm 템플리트 등) 일 것입니다. –

+2

범위가 지정되지 않은 변수는 변수 범위로 기본 설정되어 있으므로 새 "local "범위"또는 "var"키워드 사용. –

5

당신은 확실히 아담이 말한대로 로컬 범위를 사용해야하지만, 루프의 경우 가독성을 위해 "로컬"접두사보다는 "var"키워드를 사용하는 것이 중요하다고 생각합니다. CF9를 사용하면 더 이상 함수의 맨 위에 var 선언을 두지 않아도되므로 모든 인덱스 "i"변수가 "for"조건문에 "var"을 추가하여 스레드로부터 안전 해지면됩니다.

전에 목록의 길이를 저장하는 루프를 시작하고, 코드가 될 것 내가 스타일을 증가 ++ 더 간결 사용에 대한 벤의 좋은 점에 촬영

:

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