20

我正在寻找inspect.getargspec()在 Javascript 中做相当于 Python 的东西。

我知道您可以arguments从 Javascript 函数中获取列表,但我真正要查找的是来自最初定义的函数的参数名称

如果这实际上是不可能的,我将不得不通过获取函数的字符串来“蛮力”它,即myFunc.toString()然后...解析function myFunc(...). 有谁知道如何以一般方式进行这种解析?

感谢您的任何提示。

4

5 回答 5

24

虽然我看不出有什么好的理由,

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

假设func是您的函数的名称

于 2009-05-27T10:28:19.957 回答
5

以下函数将返回传入的任何函数的参数名称数组。

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']
于 2012-03-29T11:44:56.237 回答
4

这里有一个小的 nodejs 模块。

https://github.com/kilianc/node-introspect

于 2011-11-22T10:03:07.543 回答
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>
于 2009-06-18T09:14:27.023 回答
-1

Jonathan 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.

(也发布在如何从 javascript 动态获取函数参数名称/值

于 2009-06-17T19:18:46.160 回答