11

引自Adob​​e ColdFusion 10:使用闭包文档

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

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

闭包和函数部分还提到在已经很长的范围搜索之上还有 4 个范围:

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

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

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

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

谢谢


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

4

2 回答 2

7
    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。

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

ps 您可以使用 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));
于 2012-05-16T11:02:04.743 回答
3

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

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

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

如果我是你,我会向 Adob​​e 提出一个错误。

于 2012-05-16T07:55:44.980 回答