Ответ 1
var entire = derp.toString();
var body = entire.slice(entire.indexOf("{") + 1, entire.lastIndexOf("}"));
console.log(body); // "a(); b(); c();"
Пожалуйста, используйте поиск, это дубликат этого вопроса
function derp() { a(); b(); c(); }
derp.toString()
вернет "function derp() { a(); b(); c(); }"
, но мне нужно только тело функции, поэтому "a(); b(); c();"
, потому что я могу затем оценить выражение. Возможно ли это сделать в кросс-браузере?
var entire = derp.toString();
var body = entire.slice(entire.indexOf("{") + 1, entire.lastIndexOf("}"));
console.log(body); // "a(); b(); c();"
Пожалуйста, используйте поиск, это дубликат этого вопроса
Поскольку вам нужен текст между первым {
и последним }
:
derp.toString().replace(/^[^{]*{\s*/,'').replace(/\s*}[^}]*$/,'');
Обратите внимание, что я разбил замену на регулярные выражения вместо одного регулярного выражения, покрывающего все это (.replace(/^[^{]*{\s*([\d\D]*)\s*}[^}]*$/,'$1')
), потому что оно намного менее требовательно к памяти.
ПРИМЕЧАНИЕ. Принимаемый ответ зависит от того, что интерпретатор не делает сумасшедшие вещи, например, отбрасывая комментарии между "функциями" и "{". 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"}"
Пример с одной строкой, короткий регулярный выражение:
var body = f.toString().match(/^[^{]+\{(.*?)\}$/)[1];
Если вы хотите, в конце концов, eval
script, и если функция не принимает никаких параметров, это должно быть немного быстрее:
var body = '(' + f.toString() + ')()';
Вам нужно что-то вроде этого:
var content = derp.toString();
var body = content.match(/{[\w\W]*}/);
body = body.slice(1, body.length - 1);
console.log(body); // a(); b(); c();