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

derp.toString()将返回"function derp() { a(); b(); c(); }",但我只需要函数体,所以"a(); b(); c();",因为我可以评估表达式。是否有可能以跨浏览器的方式执行此操作?

4

5 回答 5

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

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

请使用搜索,这是这个问题的重复

于 2012-09-01T12:34:02.250 回答
9

由于您想要第一个{和最后一个之间的文本}

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

请注意,我将替换分解为正则表达式,而不是一个覆盖整个事物的正则表达式 ( .replace(/^[^{]*{\s*([\d\D]*)\s*}[^}]*$/,'$1')),因为它占用的内存要少得多。

于 2012-09-01T12:34:55.873 回答
4

注意:接受的答案取决于解释器不做疯狂的事情,比如在“function”和“{”之间抛出评论。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"}"
于 2013-09-05T23:57:42.697 回答
3

一个单行简短的正则表达式示例:

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

如果你最终想要eval脚本,并假设函数不带参数,这应该会快一点:

var body = '(' + f.toString() + ')()';
于 2014-12-30T18:14:06.530 回答
2

你需要这样的东西:

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

console.log(body); // a(); b(); c();
于 2012-09-01T12:41:42.227 回答