Как получить текстовый текст функции в JavaScript?

function derp() { a(); b(); c(); }

derp.toString() вернет "function derp() { a(); b(); c(); }", но мне нужно только тело функции, поэтому "a(); b(); c();", потому что я могу затем оценить выражение. Возможно ли это сделать в кросс-браузере?

Ответы

Ответ 1

var entire = derp.toString(); 
var body = entire.slice(entire.indexOf("{") + 1, entire.lastIndexOf("}"));

console.log(body); // "a(); b(); c();"

Пожалуйста, используйте поиск, это дубликат этого вопроса

Ответ 2

Поскольку вам нужен текст между первым { и последним }:

derp.toString().replace(/^[^{]*{\s*/,'').replace(/\s*}[^}]*$/,'');

Обратите внимание, что я разбил замену на регулярные выражения вместо одного регулярного выражения, покрывающего все это (.replace(/^[^{]*{\s*([\d\D]*)\s*}[^}]*$/,'$1')), потому что оно намного менее требовательно к памяти.

Ответ 3

ПРИМЕЧАНИЕ. Принимаемый ответ зависит от того, что интерпретатор не делает сумасшедшие вещи, например, отбрасывая комментарии между "функциями" и "{". IE8 с радостью сделает это:

>>var x = function /* this is a counter-example { */ () {return "of the genre"};
>>x.toString();
"function /* this is a counter-example { */ () {return "of the genre"}"

Ответ 4

Пример с одной строкой, короткий регулярный выражение:

var body = f.toString().match(/^[^{]+\{(.*?)\}$/)[1];

Если вы хотите, в конце концов, eval script, и если функция не принимает никаких параметров, это должно быть немного быстрее:

var body = '(' + f.toString() + ')()';

Ответ 5

Вам нужно что-то вроде этого:

var content = derp.toString();
var body = content.match(/{[\w\W]*}/);
body = body.slice(1, body.length - 1);

console.log(body); // a(); b(); c();