Обход закрытия в функциональном выражении CFML

Я полностью обсудил это требование и свои исследования в своем блоге: "Может ли выражение функции обойти закрытие?"

Таким образом, когда у вас есть этот код:

o = new C();

function dumpVariables(){
    writeDump(var=variables);
}

o.dumpVariables = dumpVariables;
o.dumpVariables();

Тогда writeDump() будет ссылаться на область действия внутренних переменных CFC. Однако, если вместо объявления используется функциональное выражение:

dumpVariables = function (){
    writeDump(var=variables);
};

(Остальная часть кода такая же, только как создается функция dumpVariables())

... затем - поскольку функциональные выражения используют замыкание при привязке ссылок на переменные, эта ссылка на variables в операторе writeDump() по-прежнему ссылается на область переменных вызывающего кода, даже когда она вызывается из объекта, в который была введена функция.

Это очень упрощенный случай воспроизведения для целей постановки этого вопроса, поэтому условие состоит в том, что функция, внедряемая в объект, должна создаваться с помощью функционального выражения, а другое условие заключается в том, что выражение функции — единственный код, который я могу изменить. Я говорю это, потому что я полностью осведомлен об обходных путях для этого, которые не используют функциональные выражения, или не используют изменения в коде CFC и т.д... это не моя проблема. Проблема, с которой я столкнулся, и я надеюсь, что кто-то может помочь, заключается в том, как можно получить доступ к контексту переменной, когда функция вызывается, а не когда она объявляется< /сильный>.

Спасибо за любое понимание. Я подозреваю, что ответ "не может быть сделано".


person Adam Cameron    schedule 24.11.2013    source источник
comment
Интересно, если writedump(var=this); будет работать лучше   -  person James A Mohler    schedule 24.11.2013
comment
(Я рассказал об этом в статье в блоге внизу). Да, по стечению обстоятельств он работает нормально, и я воспользуюсь им, если понадобится. Однако в реальных условиях это далеко не идеальное решение.   -  person Adam Cameron    schedule 24.11.2013
comment
У меня нет времени, чтобы на самом деле проверить, актуально ли это, и я только быстро просмотрел статью в блоге, чтобы проверить, упоминается ли она, но для аналогичного случая маскировки области см.: stackoverflow.com/questions/18413893/ - возможно, там есть что-то полезное?   -  person Peter Boughton    schedule 25.11.2013
comment
Cheers @PeterBoughton, да, кто-то упомянул, что в ответ на ситуацию, которая у меня была, очень похожая на ситуацию в другом вопросе, на который вы ссылаетесь (мой случай: cfmlblog.adamcameron.me/2013/10/blocked-request.html). Здесь это не поможет.   -  person Adam Cameron    schedule 25.11.2013