2012-05-15 3 views
10

Adobe ColdFusion 10: Using closures documentation에서 인용 :CF10에서 클로저 변수를 범위 지정하는 방법은 무엇입니까?

function helloTranslator(String helloWord) 
{ 
    return function(String name) 
    { 
     return "#helloWord#, #name#"; 
    }; 
} 

어떻게 범위 helloWord 및 반환 라인에 제대로 name에? 둘 다 Arguments 범위에 있습니까? 그렇다면 고유해야합니다.

  1. 폐쇄의 : 폐쇄에

    은 다음 범위가 지정되지 않은 변수에 대한 검색의 순서는 다음과 같습니다

    Closures and functions 섹션에는 이미 긴 범위 검색의 상단에 4 개 개의 범위가 언급 local 범위

  2. 폐쇄의 범위 arguments
  3. 외부 함수의 local 범위 경우 availa BLE
  4. 소유자 기능의 local 범위를 사용할 수
  5. ColdFusion이 내장 된 경우 범위

'local.'로 I 범위 무엇인가, 그것은 단지 하나를 검색하거나 1,3 & 4 싶다면?

안녕히 계신가요, 클로저 & 바깥 쪽을 이해합니다. 누구입니까 소유자?

감사합니다


업데이트 : 강화 요청이 접수 : ColdFusion 10.0 - Feature 3191742

답변

7
function helloTranslator(String helloWord) 
    { 
     return function(String name) 
     { 
     return "#helloWord#, #name#"; 
     }; 
    } 

여기 helloWordname는 범위가 될 수 없다. Owner 범위에는 "함수 내에 정의 된 클로저"가 있는데이 변수가있는 곳 (부모) 함수의 로컬 범위입니다. 따라서 이러한 변수는 클로저에서 액세스 할 수 있도록 고유해야합니다 (함수 내에서).

폐쇄에

, 범위가 지정되지 않은 변수에 대한 검색을 통해 진행됩니다

  1. 폐쇄의 지역 범위
  2. 폐쇄의 인수 범위
  3. 외부/소유자 함수의 로컬 범위 가능한 경우
  4. 외부/소유자 함수의 인수 범위 가능한 경우
  5. 변수 범위 (마감일 현재 사용 가능)
  6. ColdFu sion 내장 범위

무언가가 Local으로 범위가 지정되어 있으면 폐쇄에서 1로만 검색합니다. AFN에는 3,4에 대해 직접 범위를 지정할 수있는 방법이 없습니다.

p.s. 앞에서 말한 것처럼 Owner 범위는 클로저가 생성 될 때 부모/외부 함수의 로컬 범위의 캐시 된 복사본을 가리키는 암시 적 범위 일뿐입니다.

p.s. 이 범위를 명시 적으로 만들려면 log an enhancement with ColdFusion 수 있습니다.

다른 범위의 예는 다음과 같습니다. 이것을 실행하면 closure가 differnt 범위를 사용하는 방법을 이해해야합니다.

any function exampleClosureForm(arg1){ 

    function x(innerArg1,innerArg2){ 
     //var arg1= 50;// will hide parent's arg1 if declared 
     writedump(arguments);// would dump closure's 
     writedump(local);// would dump closure's 
     writedump(session.a); // would be same session shared across 
     writedump(arg1); // would dump parents argument arg1 
     return session.a-- + innerArg1+innerArg2+arg1--;// decrementing to see its behavior for successive call 
    }; 
    writeoutput(x(1,2)); 
    writedump(arguments,"browser","html",false,"function");// would dump parent's 
    writedump(local,"browser","html",false,"function");// would dump parent's 
    arg1 = -100; // since closure is sharing the parent's variable, this change should get reflected 
    return x; 
} 
session.a = 10; 
a = exampleClosureForm(10); 
writeoutput("now the calls <br>"); 
writeoutput(a(innerArg1=5,innerArg2=5)); 
writeoutput("<br>"); 
// with argumentcollection 
argsColl = structNew(); 
argsColl.innerArg1= 1; 
argsColl.innerArg2= 3; 
writeoutput(a(argumentCollection = argsColl)); 
+0

당신이 더 완전한 코드 예제를 제공 주실 래요, 다음 레이블이있는 VAR는 범위에 속하는? 클로저가 생성 될 때 사용할 수있는 var는 무엇입니까? 이 주제에 관한 블로그 게시물일까요? 혼란스러워지고 있습니다. 고맙습니다. – Henry

+0

응급실 응급실 : https://bugbase.adobe.com/index.cfm?event=bug&id=3191742 – Henry

+1

@Henry 예는 의견에 맞지 않을 것입니다. 그래서 나는 그것에 대한 별도의 대답을하고 있습니다. –

2

네는, 지금까지 내가 말할 수있는, 하나, 그래서 당신 폐쇄의 주장 부모 함수의 인수에 대한 범위를 지정할 수 없습니다 다른 이름이 필요합니다. 하나 한다고하기에 부모의 인수 범위를 참조 할 수 있도록 :

function helloTranslator(String s){ 
    var otherS = arguments.s; 
    return function(String s){ 
     return "#otherS#, #s#"; 
    }; 
} 

이 이상적 미만 : 당신이 할 필요가있을 것이다 것은 다른 이름으로, 부모 함수에서 매개 변수를하는 것입니다 범위가 지정된 패션은 단순히 CF가 경기를하기 위해 사냥하는 것을 요구하지 않습니다.

나는 당신 이었다면 raise a bug with Adobe이었습니다.

+0

ER이 제기 : https://bugbase.adobe.com/index.cfm?event=bug&id=3191742 – Henry

관련 문제