2009-05-27 110 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']