Как включить переменные закрытия в CF10?

Цитата из Adobe ColdFusion 10: Использование документации по закрытию:

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

Как область видимости helloWord и name правильно на обратной линии? Являются ли они оба в области Arguments? Если это случай, они должны быть уникальными?

В разделе Closures and functions также упоминается, что еще больше областей области поиска уже длинных областей:

В закрытии следуют порядок поиска переменной без знака:

  • Закрытие local область
  • Закрытие Arguments область
  • Внешняя функция local область действия, если доступна
  • Функция владельца local, если доступна
  • Встроенная область ColdFusion

Если я использую что-то как 'local.', будет ли он искать только 1, или 1,3 и 4?

Кстати, я понимаю Closure и Outer. Кто является владельцем?

Спасибо


Обновление: Заявка на повышение: ColdFusion 10.0 - Feature 3191742

Ответ 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));

Ответ 2

Да, насколько я могу судить, нельзя указать область аргументов родительской функции, поэтому ваши аргументы закрытия должны иметь разные имена. Что вам нужно сделать, так это иметь промежуточную переменную в родительской функции с другим именем:

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

Это меньше идеала: нужно иметь возможность ссылаться на область родительских аргументов в области видимости, а не просто требовать, чтобы CF охотилась вокруг для соответствия.

Я бы поднять ошибку с помощью Adobe, если бы я был вами.