Можно ли пометить анонимную функцию как «Живой код», чтобы Closure Compiler не удалял ее? - PullRequest
1 голос
/ 22 ноября 2011

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

Скажем, у меня есть файл 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 ]

1 голос
/ 22 ноября 2011

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

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

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

1 голос
/ 22 ноября 2011

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

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

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

var code = '(function(){return "I am here!";}())';
var f = eval('(function(){return ' + code + '})');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...