如何在CF10中调整闭包变量的范围?

时间:2012-05-15 15:38:23

标签: coldfusion scope closures coldfusion-10

引自Adobe ColdFusion 10: Using closures documentation

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

如何在回程线上正确定位helloWordname?它们都在Arguments范围内吗?如果是这种情况,它们必须是唯一的吗?

Closures and functions部分还提到在已经很长的范围搜索之外还有4个范围:

  

在结束时,以下是搜索未范围变量的顺序:

     
      
  1. Closure的local范围
  2.   
  3. Closure的arguments范围
  4.   
  5. 外部功能的local范围(如果有)
  6.   
  7. 所有者功能的local范围(如果有)
  8.   
  9. ColdFusion内置范围
  10.   

如果我将某些内容定位为'local.',它会仅搜索1,还是1,3& 4?

顺便说一句,我知道Closure&外。谁是所有者

谢谢


更新:提交的增强请求:ColdFusion 10.0 - Feature 3191742

2 个答案:

答案 0 :(得分:7)

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

此处helloWordname无法作用域。存在一个隐式Owner范围,其中“在函数内定义了闭包”,这是声明(父)函数的局部范围,其中存在这些变量。因此,这些变量必须是唯一的(在函数内)才能从闭包中访问。

在闭包中,搜索未编码的变量将通过:

  1. Closure的本地范围
  2. Closure的论点范围
  3. 外部/所有者功能的本地范围(如果有)
  4. 外部/所有者功能的参数范围(如果有)
  5. 变量范围(在关闭创建时可用)
  6. ColdFusion内置范围
  7. 如果某些内容的范围为Local,则在闭包中,它将仅搜索1。 AFN没有办法直接范围为3,4。

    P.S。如前所述,Owner范围只是一个隐式范围,它指向创建闭包时父/外函数的本地范围的缓存副本。

    P.S。您可以log an enhancement with ColdFusion使此范围明确。

    不同范围的示例如下。运行它,你应该理解闭包将如何使用不同的范围。

    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));
    

答案 1 :(得分:2)

是的,据我所知,无法为父函数的参数指定范围,因此您的闭包的参数需要具有不同的名称。您需要做的是在父函数中使用不同的名称:

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

这不太理想:一个应该能够以范围的方式引用父的参数范围,而不是简单地要求CF寻找匹配。

如果我是你,我会raise a bug with Adobe