Ответ 1
function helloTranslator(String helloWord)
{
return function(String name)
{
return "#helloWord#, #name#";
};
}
Здесь helloWord
и name
не могут быть ограничены. Существует неявная область Owner
с "замыканиями, определенными внутри функции", которая является локальной областью определения (родительской) функции, в которой присутствуют эти переменные. Таким образом, эти переменные должны быть уникальными (внутри функции) для доступа к закрытию.
В закрытии поиск переменной без пробела проходит через:
- Закрытие локальной области
- Закрытие аргументов scope
- Локальная область функции Outer/Owner, если доступна
- Область аргументов функции внешнего/владельца, если доступна
- Область переменных (доступна во время создания закрытия)
- Встроенная область ColdFusion
Если что-то ограничено как Local
, в закрытии оно будет искать только в 1. AFN нет возможности прямого охвата для 3,4.
p.s. как уже говорилось ранее, область Owner
- не что иное, как неявная область, которая указывает на кэшированную копию локальной области родительской/внешней функции во время создания закрытия.
p.s. Вы можете записать расширение с помощью ColdFusion, чтобы сделать эту область явной.
Ниже приведен пример различных областей. Запустите это, и вы поймете, как закрытие будет использовать разные области.
any function exampleClosureForm(arg1){
function x(innerArg1,innerArg2){
//var arg1= 50;// will hide parent 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 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));