【问题标题】:How to scope closure's variables in CF10?如何在 CF10 中确定闭包变量的范围?
【发布时间】:2012-05-23 04:00:54
【问题描述】:

引用自Adobe ColdFusion 10: Using closures documentation

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

如何在返回线上正确地确定helloWordname 的范围?它们都在Arguments 范围内吗?如果是这样,它们一定是唯一的吗?

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

最后,以下是搜索无作用域变量的顺序:

  1. 闭包的local范围
  2. 闭包的arguments范围
  3. 外部函数的local 范围(如果可用)
  4. 所有者函数的 local 范围(如果可用)
  5. ColdFusion 内置范围

如果我的范围是'local.',它会只搜索 1,还是搜索 1,3 和 4?

顺便说一句,我了解 Closure & Outer。谁是所有者

谢谢


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

【问题讨论】:

    标签: coldfusion scope closures coldfusion-10


    【解决方案1】:
        function helloTranslator(String helloWord) 
        { 
          return function(String name) 
          { 
            return "#helloWord#, #name#"; 
          }; 
        }
    

    这里的helloWordname 不能限定范围。有一个隐含的Owner 作用域,其中“函数内定义的闭包”是声明(父)函数的局部作用域,其中存在这些变量。所以这些变量必须是唯一的(在函数内)才能从闭包中访问。

    在闭包中,搜索一个未作用域的变量:

    1. 闭包的本地范围
    2. 闭包的参数范围
    3. 外部/所有者函数的本地范围(如果可用)
    4. 外部/所有者函数的参数范围(如果可用)
    5. 变量范围(在创建闭包时可用)
    6. ColdFusion 内置范围

    如果某些东西的范围为Local,在闭包中,它只会在 1 中搜索。 AFN 没有办法直接确定 3,4 的范围。

    附言如前所述Owner 作用域只不过是一个隐式作用域,它在创建闭包时指向父/外部函数本地作用域的缓存副本。

    附言你可以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));
    

    【讨论】:

    • 你能否提供一个更完整的代码示例,然后标记哪个var属于哪个范围?以及在创建闭包时可用的 var 是什么?也许关于这个主题的博客文章?它变得令人困惑。谢谢。
    • @Henry 的例子不适合在评论中,所以我要单独回答这个问题
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-10-27
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多