2017-04-19 59 views
0

我正在尋找一種方法來從一串js代碼中獲取名稱的函數聲明主體。我在Nodejs環境中。 假設我有一些spaghetti.js文件。我可以讀入一個字符串如何使用javascript解析字符串中的函數體?

const allJs = fs.readFileSync('spaghetti.js'); 

現在我需要接收該字符串和函數的名稱,並返回{ }之間的所有字符串的函數。

像這樣的事情

allJs = 'let a=1; const b=[2, 3]; function cook(items){return items}; cook(b)'; 
parseFunction(allJs, 'cook');//'return items' 

輸入JS的複雜性沒有限制。

我試圖找到一個npm模塊,但沒有運氣。

+1

你的'parseFunction'的第二個參數(「cook」)是什麼? – Jamiec

+0

如果輸入js的複雜性不受限制,則應指定您想要的函數體。所有,只是第一個,一個特殊的,甚至嵌套的,類方法等...? – dsuckau

+0

@Jamiec這是一個在輸入代碼 – Andrey

回答

0

A String可以通過本地eval()方法進行本地評估。但請記住,eval is a form of evil

如果parseFunction()以上是依靠something like this則全局Function constructor正在使用,「新的」功能被綁定到該操作的返回值(並且因此本身需要該返回值被調用)。

一種簡單的方式來實現,這可能是做這樣的事情...

var funcString = 'var a = 1, b = 3;'; 
funcString += 'function summit(){return a + b;}'; 
funcString += 'return summit();'; 

function makeNewFunc(str) { 
    return new Function(str); 
} 

var newFunc = makeNewFunc(funcString); 

console.log('newFunc:',newFunc); 
//-> newFunc: function anonymous() 

console.log('newFunc():',newFunc()); 
//-> newFunc(): 4 

這表明功能如何可以創建和來自String片段調用。 (編輯:Turning something like that into a Node module is a simple matter);

希望有幫助。 :)

+0

看來你還沒有明白我的問題。我不想調用任何東西。我只想得到代表某個特定功能主體的STRING。簡單的文字。你可以把它看作某種形式的靜態代碼分析。 – Andrey

+0

@Andrey - 我把你的問題,標題和建議的'parseFunction'函數表示你正在尋找,你知道,從一個字符串解析一個函數。如果你想提取一個函數體的字符串表示,那麼你在「函數反編譯」之後 - 看到這個回答:http://stackoverflow.com/a/3179967/4746328 –