2009-05-27 26 views
17

我期待在Javascript中執行相當於Python的inspect.getargspec()檢查JavaScript函數的定義/執行中參數的名稱/值

我知道您可以從Javascript函數獲取arguments列表,但我真正需要的是名稱來自最初定義的函數的參數。

如果這其實是不可能的,我將不得不「蠻力」它通過獲取函數的字符串,即myFunc.toString()然後解析出...function myFunc(...)內。有誰知道如何以一般方式進行解析?

感謝您的任何提示。

回答

22

雖然我看不到任何好的理由,

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

假設func是你的函數的名稱

+0

好的,謝謝!我的確有一些很好的理由:) ...他們主要是想在JavaScript中複製一些使用`inspect.getargspec()`的Python代碼。 – clemesha 2009-05-27 10:38:42

+0

我仍然想知道,如果這是做這種檢查的唯一方法...沒有更優雅的方式嗎? – clemesha 2009-05-28 20:45:00

-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

下面是一個使用高階函數的版本。我不喜歡它的唯一情況是你必須指定參數作爲數組的成員。但至少他們只需要指定一次。

<!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'] 
相關問題