JavaScript получает тело функции

У меня есть функция, например.

var test = function () {alert(1);}

Как я могу получить тело этой функции?

Я предполагаю, что единственный путь состоит в том, чтобы проанализировать результат test.toString () метод, но является там каким-либо другим путем? Если парсинг является единственным путем, каков будет regex для получения до тела? (помощь с regex чрезвычайно необходима, потому что я не знаком с ними),

26
задан kalan 5 July 2010 в 13:30
поделиться

3 ответа

ЕСЛИ(!!!) вы можете получить toString(), тогда вы можете просто взять подстроку от первого indexOf("{") до lastIndexOf("}"). Итак, что-то вроде этого "работает" (как показано на ideone.com):

var test = function () {alert(1);}

var entire = test.toString(); // this part may fail!
var body = entire.substring(entire.indexOf("{") + 1, entire.lastIndexOf("}"));

print(body); // "alert(1);"
45
ответ дан 28 November 2019 в 06:35
поделиться

Обновление 2015 г.

При повторном просмотре состояния декомпиляции функции можно сказать, что это в целом безопасно в некоторых хорошо продуманных вариантах использования и среды (например, рабочие Node.js с функциями, определяемыми пользователем).

Его следует поместить в ту же корзину, что и eval , который является мощным инструментом, имеющим свое место, но его следует использовать только в редких случаях. Подумайте дважды, это мой единственный совет.

Выводы нового исследования Кангакса :

  • Это все еще нестандартное
  • Пользовательские функции в целом выглядят нормально
  • Есть необычных движков (особенно если речь идет об исходном коде размещение, пробелы, комментарии, мертвый код)
  • В будущем могут появиться необычные движки (особенно мобильные или необычные устройства с консервативной памятью / энергопотреблением)
  • Связанные функции не показывают их исходный источник (но сохраняют идентификатор ... иногда)
  • Вы можете столкнуться с нестандартными расширениями (например, с выражением Mozilla закрытия)
  • Скоро появится ES6 , и теперь функции могут выглядеть совсем иначе, чем они использовали для
  • Минификаторы / препроцессоры вам не друзья

"декомпиляция функций" - процесс получения строковое представление объекта Function.

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

@kangax на comp.lang.javascript

11
ответ дан 28 November 2019 в 06:35
поделиться

Попробуйте так:

/\{(\s*?.*?)*?\}/g.exec(test.toString())[0]

test.toString() сохранит все ваше объявление.

/{(\s*?. ?)?}/g будет соответствовать всему, что находится между вашими скобками

-1
ответ дан 28 November 2019 в 06:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: