AngularJSのDIとかで利用されているやつです。
関数オブジェクトのtoString()
メソッドがソースコードを返すので、それを利用します。
function getParams(func) {
var source = func.toString()
.replace(/\/\/.*$|\/\*[\s\S]*?\*\/|\s/gm, ''); // strip comments
var params = source.match(/\((.*?)\)/)[1].split(',');
if (params.length === 1 && params[0] === '')
return [];
return params;
}
関数のソースコードを正規表現使ってゴリゴリと処理します。
getParams(function() {}); // => []
getParams(function(a) {}); // => ['a']
getParams(function(a, b) {}); // => ['a', 'b']
getParams(function(a, /* 途中に改行があっても、、、 */
b) {}); // => ['a', 'b']
こんな感じで使えるはずです。
バグとかあったら教えて下さい。