Как мне сказать компилятору закрытия, что анонимная функция не должна удаляться как мертвый код?Я не хочу сохранять функцию в объекте окна.Я ищу альтернативную технику.
Скажем, у меня есть файл javascript, который содержит одну гигантскую анонимную функцию.
(function(){return "I am here!"})
Для использования я загружаю эту функцию через ajax, а затем записываю вывод eval, используя что-то вроде
var f = eval('(function(){return "I am here!"})');
Это назначает анонимную функцию в переменной f.
d8> var f = eval('(function(){return "I am here!"})');
d8> f
function (){return "I am here!"}
d8> f()
I am here!
Когда я запускаю компилятор над моим js-файлом, который содержит одну большую анонимную функцию, компилятор «оптимизирует» мой код, ничего не выводя.Это явно не то, что я хочу.Есть ли какой-нибудь JSDoc, который я могу поставить над своей функцией, чтобы пометить как не мертвый код?
~~~~~~~~~~~~~~~~~~~~~~~~
Обойти: (Это не совсем то, что я хотел, но, похоже, это лучший результат с доступными инструментами)
~~~~~~~~~~~~~~~~~~~~~~~~
В итоге я использовал комбинацию ответов Джона и Дэвида:
// code would be provided from an ajax request
var code = 'function F(){return "I am here!"};'
code = "("+code.replace(/\s*\;\s*$/, "")+");"
f = eval(code);
Присвоение имени функции делает счастливым компилятор Closure,
В зависимости от функции, компилятор замыкания будет определять переменные вне функции, поэтому я заключаю код в скобки, чтобы избежать определения глобальных переменных.
Метод replace просто перемещает последнюю точку с запятой, использованную для разделения определения функции, чтобы не вызывать синтаксическую ошибку.