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

derp.toString()"function derp() { a(); b(); c(); }" वापस आ जाएगी, लेकिन मैं केवल,, समारोह के शरीर की जरूरत है ताकि "a(); b(); c();" क्योंकि मैं तो अभिव्यक्ति का मूल्यांकन कर सकते हैं। क्या यह क्रॉस-ब्राउज़र तरीके से ऐसा करना संभव है?जावास्क्रिप्ट में फ़ंक्शन बॉडी टेक्स्ट कैसे प्राप्त करें?

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

ध्यान दें कि मैं प्रतिस्थापन तोड़ दिया:

+0

'a(); ख(); सी(); 'वैध अभिव्यक्ति नहीं है हालांकि ... –

+0

@ फ़ेलिक्सक्लिंग: यह मान्य क्यों नहीं है? –

+3

@ user1600680: '; 'बयानों को अलग करता है और इसलिए अभिव्यक्ति का हिस्सा नहीं हो सकता है। ग्रुपिंग ऑपरेटर '(...)' में डालते समय सिंटैक्स त्रुटि फेंकने वाली हर चीज वैध अभिव्यक्ति नहीं है। लेकिन हो सकता है कि ओपी ने इस तकनीकी अर्थ को * अभिव्यक्ति * शब्द के साथ संदर्भित न किया हो। –

उत्तर

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

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

खोज का उपयोग करें, इस this question

+2

'.llice' का प्रयोग करें। यह वही है, लेकिन कम भ्रमित है। –

+0

क्या आपका मतलब है 'var body = whole.slice (whole.indexOf ("{") + 1, whole.lastIndexOf ("}")); '? –

+1

हाँ, मैं करता हूं। 'substring' और' substr' आम तौर पर लोगों को भ्रमित करते हैं। 'टुकड़ा' बहुत अधिक यादगार है। –

5

ज़रूर की डुप्लीकेट, क्योंकि आप पहली बार { और पिछले } के बीच पाठ चाहते है पूरी चीज (.replace(/^[^{]*{\s*([\d\D]*)\s*}[^}]*$/,'$1')) को कवर करने वाले एक रेगेक्स के बजाय रेगेक्स में नीचे जाना क्योंकि यह बहुत कम स्मृति-गहन है।

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

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

'toString 'के बजाय' toString() 'लेकिन यह सबसे साफ जवाब है जो मैंने पाया है, धन्यवाद! – kursus

2

आप कुछ इस तरह की जरूरत को स्वीकार कर लिया जवाब दुभाषिया 'समारोह' और '{' के बीच की टिप्पणियां वापस फेंकने की तरह पागल बातें नहीं कर रही पर निर्भर करता है। लघु regex उदाहरण

>>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

एक एकल लाइन,: IE8 खुशी से ऐसा करेंगे

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

आप के लिए, अंत में, eval स्क्रिप्ट, और कोई पैरामीटर समारोह संभालने लेता चाहते हैं तो यह चाहिए थोड़ा तेज़ हो:

var body = '(' + f.toString() + ')()'; 
संबंधित मुद्दे