Ответ 1
Пока я не вижу никакой веской причины для этого,
var reg = /\(([\s\S]*?)\)/;
var params = reg.exec(func);
if (params)
var param_names = params[1].split(',');
Предполагая, что func
- это имя вашей функции
Я ищу, чтобы сделать эквивалент Python inspect.getargspec()
в Javascript.
Я знаю, что вы можете получить список arguments
из функции Javascript, но то, что я действительно ищу, - это имена аргументов из первоначально определенной функции.
Если это на самом деле невозможно, мне придется "переборщить" его, получив строку функции, т.е. myFunc.toString()
, а затем разобрав ...
внутри function myFunc(...)
. Кто-нибудь знает, как сделать этот синтаксический анализ в общем виде?
Спасибо за любые советы.
Пока я не вижу никакой веской причины для этого,
var reg = /\(([\s\S]*?)\)/;
var params = reg.exec(func);
if (params)
var param_names = params[1].split(',');
Предполагая, что func
- это имя вашей функции
здесь маленький модуль nodejs для этого.
Следующая функция вернет массив имен параметров любой переданной функции.
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']
Здесь версия, использующая функции более высокого порядка. Единственное, что мне не нравится в этом, - это указать параметры как члены массива. Но, по крайней мере, их нужно указывать только один раз.
<!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>
Исправлена улучшенная версия ответа Джонатана Финнга:
// 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)