function helloTranslator(String helloWord)
{
return function(String name)
{
return "#helloWord#, #name#";
};
}
Here helloWord
and name
无法确定范围。有一个隐含的Owner
范围“函数内定义的闭包”是声明(父)函数的局部范围,其中存在这些变量。因此,这些变量必须是唯一的(在函数内)才能从闭包访问。
在闭包中,搜索无作用域变量的过程如下:
- 闭包的局部作用域
- 闭包的参数范围
- 外部/所有者函数的本地范围(如果可用)
- 外部/所有者函数的参数范围(如果可用)
- 变量范围(在创建闭包时可用)
- ColdFusion 内置范围
如果某物的范围为Local
,在闭包中,它只会在 1 中搜索。 AFN 没有办法直接作用于 3,4。
附注如前所述Owner
作用域只不过是一个隐式作用域,它指向创建闭包时父/外部函数的本地作用域的缓存副本。
附注您可以使用 ColdFusion 记录增强 https://bugbase.adobe.com/明确这一范围。
不同范围的示例如下。运行这个,您将了解闭包如何使用不同的作用域。
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));