У меня есть функция, например.
var test = function () {alert(1);}
Как я могу получить тело этой функции?
Я предполагаю, что единственный путь состоит в том, чтобы проанализировать результат test.toString () метод, но является там каким-либо другим путем? Если парсинг является единственным путем, каков будет regex для получения до тела? (помощь с regex чрезвычайно необходима, потому что я не знаком с ними),
ЕСЛИ(!!!) вы можете получить 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);"
Обновление 2015 г.
При повторном просмотре состояния декомпиляции функции можно сказать, что это в целом безопасно в некоторых хорошо продуманных вариантах использования и среды (например, рабочие Node.js с функциями, определяемыми пользователем).
Его следует поместить в ту же корзину, что и eval , который является мощным инструментом, имеющим свое место, но его следует использовать только в редких случаях. Подумайте дважды, это мой единственный совет.
Выводы нового исследования Кангакса :
"декомпиляция функций" - процесс получения строковое представление объекта Function.
Декомпиляция функций обычно не рекомендуется, так как это нестандартная часть языка, и в результате код становится не совместимы и потенциально подвержен ошибкам .
@kangax на comp.lang.javascript
Попробуйте так:
/\{(\s*?.*?)*?\}/g.exec(test.toString())[0]
test.toString() сохранит все ваше объявление.
/{(\s*?. ?)?}/g будет соответствовать всему, что находится между вашими скобками