2012-09-01 30 views
16
function derp() { a(); b(); c(); } 

derp.toString() sẽ trả về "function derp() { a(); b(); c(); }", nhưng tôi chỉ cần phần thân của hàm, vì vậy, "a(); b(); c();", vì sau đó tôi có thể đánh giá biểu thức. Có thể thực hiện điều này theo cách khác không?Làm thế nào để có được văn bản nội dung chức năng trong JavaScript?

+0

'a(); b(); c(); 'không phải là biểu thức hợp lệ mặc dù ... –

+0

@FelixKling: Tại sao nó không hợp lệ? –

+3

@ user1600680: ';' phân tách các câu lệnh và do đó không thể là một phần của một biểu thức. Tất cả mọi thứ mà ném một lỗi cú pháp khi đưa vào toán tử nhóm '(...)' không phải là một biểu thức hợp lệ. Nhưng có lẽ OP không đề cập đến ý nghĩa kỹ thuật này với cụm từ * biểu thức *. –

Trả lời

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

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

Vui lòng sử dụng tìm kiếm, đây là bản sao của this question

+2

Sử dụng '.slice'. Nó giống nhau, nhưng ít khó hiểu hơn. –

+0

Bạn có nghĩa là 'var body = whole.slice (whole.indexOf (" {") + 1, whole.lastIndexOf ("} "));'? –

+1

Vâng, tôi có. 'substring' và' substr' thường gây nhầm lẫn cho mọi người. 'slice' đáng nhớ hơn nhiều. –

5

Chắc chắn là, kể từ khi bạn muốn văn bản giữa các { đầu tiên và cuối cùng }:

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

Lưu ý rằng tôi đã phá vỡ thay thế xuống để regexes thay vì một regex bao gồm toàn bộ điều (.replace(/^[^{]*{\s*([\d\D]*)\s*}[^}]*$/,'$1')) bởi vì nó ít nhiều bộ nhớ chuyên sâu.

+0

'toString()' thay vì 'toString' nhưng đây là câu trả lời rõ ràng nhất mà tôi đã tìm thấy, cảm ơn bạn! – kursus

2

Bạn cần một cái gì đó như thế này:

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

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

LƯU Ý: Câu trả lời được chấp nhận phụ thuộc vào người phiên dịch không làm những việc điên rồ như ném lại ý kiến ​​giữa 'chức năng' và '{'. IE8 hạnh phúc sẽ làm điều này:

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

Một dòng đơn, ngắn dụ regex:

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

Nếu bạn muốn, cuối cùng, eval kịch bản, và giả định chức năng mất không thông số, điều này cần nhanh hơn một chút:

var body = '(' + f.toString() + ')()'; 
Các vấn đề liên quan