Можно ли отметить анонимную функцию как "Живой код", чтобы Closure Compiler не удалял ее?

Как я могу сказать компилятору закрытия, что анонимная функция не должна удаляться как мертвый код? Я не хочу хранить функцию для объекта window. Я ищу альтернативную технику.

Скажем, у меня есть файл 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 просто перемещает последнюю точку с запятой, используемую для разделения определения функции, так что она не вызывает синтаксическую ошибку.

2 ответа

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

var code = 'return "I am here!";';
var f = eval('(function(){' + code + '})');

Если ваш код действительно "недействителен" без оболочки функций, вы можете оставить его завернутым, но выполнить оболочку, а затем продолжить, как указано выше. Например:

var code = '(function(){return "I am here!";}())';
var f = eval('(function(){return ' + code + '})');


Компилятор не создан для работы с фрагментами кода. Единственное решение, которое я вижу, - сделать код действительным.

var a = (function() {...})();

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

licensed under cc by-sa 3.0 with attribution.