2009-05-27 4 views
17

私はPythonのinspect.getargspec()に相当するJavaScriptをJavascriptで実行したいと考えています。JavaScript関数の定義/実行における引数の名前/値を調べる

私は、JavaScript関数からargumentsリストを得ることができることを知っているが、私が本当に探していることは、もともと定義された関数からの引数の名前ですか。これは実際には不可能である場合

、私はすなわち、myFunc.toString()を関数の文字列を取得し、その後function myFunc(...)の内側...を解析することにより、「ブルートフォース」それをする必要がありますするつもりです。誰かが一般的な方法でこの解析を行う方法を知っていますか?

ありがとうございます。 funcを想定し

答えて

22

私はこのために何か良い理由を見ることはできませんが、

var reg = /\(([\s\S]*?)\)/; 
var params = reg.exec(func); 
if (params) 
    var param_names = params[1].split(','); 

は、あなたの関数の名前です

+0

ニース、ありがとう!私はこれにはいくつかの理由があります:) ...そして、JavaScriptで 'inspect.getargspec()'を使用しているPythonコードを複製したいと主に関係しています。 – clemesha

+0

これがこのような検査を行う唯一の方法であれば、私はまだ疑問に思っています...それ以上のエレガントな方法はありませんか? – clemesha

+0

私が知っていることは何もありません。確かに、JavaScriptで行うことは一般的な方法ではありません。 –

-1

ジョナサンFinglandの答えの見た目改良版:

// Utility function to extract arg name-value pairs 
function getArgs(args) { 
    var argsObj = {}; 

    var argList = /\(([^)]*)/.exec(args.callee)[1]; 
    var argCnt = 0; 
    var tokens; 

    while (tokens = /\s*([^,]+)/g.exec(argList)) { 
     argsObj[tokens[1]] = args[argCnt++]; 
    } 

    return argsObj; 
} 

// Test subject 
function add(number1, number2) { 
    var args = getArgs(arguments); 
    alert(args.toSource()); // ({number1:3,number2:4}) 
} 

// Invoke test subject 
add(3, 4); 

注:これはarguments.calleeをサポートするブラウザでのみ機能します。

(またHow to get function parameter names/values dynamically from javascriptに掲載)

+0

引数を取得するために関数を実行する必要があるため、これは良くありません。質問は定義から議論を得ることでした。 –

0

ここでは高階関数を使用したバージョンです。私が気に入らないのは、配列のメンバーとしてパラメーターを指定する必要があることだけです。しかし少なくとも彼らは一度しか指定する必要がありません。

<!DOCTYPE html> 

<html> 
<head> 
<meta charset="UTF-8"> 
<title></title> 
<script type="text/javascript"> 
var withNamedParams = function(params, lambda) { 
    return function() { 
     var named = {}; 
     var max = arguments.length; 

     for (var i=0; i<max; i++) { 
      named[params[i]] = arguments[i]; 
     } 

     return lambda(named); 
    }; 
}; 

var foo = withNamedParams(["a", "b", "c"], function(params) { 
    for (var param in params) { 
     alert(param + ": " + params[param]); 
    } 
}); 

foo(1, 2, 3); 
</script> 
</head> 
<body> 

</body> 
</html> 
3

次の関数は、渡された任意の関数のパラメータ名の配列を返します

function getParamNames(func) { 
    var funStr = func.toString(); 
    return funStr.slice(funStr.indexOf('(')+1, funStr.indexOf(')')).match(/([^\s,]+)/g); 
} 

使用例:。

getParamNames(getParamNames) // returns ['func'] 
getParamNames(function (a,b,c,d){}) // returns ['a','b','c','d'] 
関連する問題