2014-01-11 74 views
0

我想從js文件中收集已定義函數的源代碼。這些函數可能很複雜,並有許多開放和關閉的括號,所以使用正則表達式會很困難。我只需要一個可調用以後的代碼功能,如下面的獲取nodejs函數定義

function dump_vars() { 
    Object.keys(global).forEach(function (key) { 
     console.log(key); 
     console.log(global[key]); 
    }); 
} 

有沒有辦法從node.js的範圍內得到函數的定義?他們是否可以保存在像全球對象那樣的地方?

回答

3

如果您有權訪問函數對象,那麼您可以使用.toString()方法獲得其定義。每Mozilla's documentation

也就是說,反編譯的toString的功能,並返回的字符串包括function關鍵字,參數列表,大括號,以及函數體的來源。

例如,假設你在mymodule.js定義模塊:

function add (a, b) { 
    return a + b; 
}; 

function mul (a, b) { 
    return a * b; 
}; 

module.exports = { 
    a: add, 
    b: mul 
}; 

然後,在index.js

var mymodule = require('./mymodule.js') 

Object.keys(mymodule).forEach(function (fun) { 
    console.log(mymodule[fun].toString()); 
}) 

這將輸出:

$ node index.js 
function add(a, b) { 
    return a + b; 
} 
function mul(a, b) { 
    return a * b; 
} 

編輯:例如,這是AngularJS如何實現依賴注入,通過使用.toString()來取回函數代碼以知道函數參數的名稱。請參閱this relevant SO answer

+0

我不知道函數名稱,代碼不會是我的,所以我會得到與正則表達式的函數名稱,然後運行toString方法對他們?這是一個好主意。我會讓你知道它是怎麼變成的:) – Evan

+0

不,我的意思是你可以在任何函數對象上運行'.toString()',比如你在導入模塊的時候得到的函數(這是我想的當你說*「只需要在代碼中稍後可調用的函數」*) –

+0

我不能確定模塊的其他語法是否正確。 – Evan