Осмотреть имена / значения аргументов в определении / выполнении функции JavaScript

17

Я ищу сделать эквивалент inspect.getargspec() Python в Javascript.

Я знаю, что вы можете получить список arguments из функции Javascript, но то, что я действительно ищу, это имена аргументов из первоначально определенной функции.

Если это на самом деле невозможно, мне придется «переборщить» его, получив строку функции, т. е. myFunc.toString() , а затем разобрав ... внутри function myFunc(...) . Кто-нибудь знает, как сделать этот синтаксический анализ в общем виде?

Спасибо за любые советы.

    
задан clemesha 27.05.2009 в 12:14
источник

5 ответов

22

Пока я не вижу никакой веской причины для этого,

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

Предполагая, что func - это имя вашей функции

    
ответ дан Jonathan Fingland 27.05.2009 в 12:28
  • Приятно, спасибо! У меня есть некоторые веские причины для этого :) ... и они в основном связаны с желанием реплицировать некоторый рабочий код Python, который использует inspect.getargspec () в JavaScript. –  clemesha 27.05.2009 в 12:38
  • Мне все еще интересно, хотя, если это единственный способ сделать такую ​​проверку ... нет более элегантного способа? –  clemesha 28.05.2009 в 22:45
  • ничего, о чем я знаю, нет. Это, конечно, не обычный способ делать что-то в JavaScript. –  Jonathan Fingland 30.11.2009 в 14:29
  • Обратите внимание, что он не очень хорошо работает с мини-инструментами, которые меняют имена переменных, поэтому при использовании таких хаков вы должны быть очень осторожны. –  Grégoire Cachet 17.12.2009 в 23:16
  • @ Grégoire: Честно говоря, это не практика, которую я бы отстаивал вообще, но вопрос OP был достаточно ясным, и это единственный способ получить эти имена аргументов. Если используется minifier, все, что вы получите, это новые миниатюрные имена, которые, надеюсь, все равно будут достаточными. –  Jonathan Fingland 18.12.2009 в 01:15
Показать остальные комментарии
4

здесь маленький модуль nodejs для этого.

Ссылка

    
ответ дан kilianc 22.11.2011 в 11:03
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']
    
ответ дан Jack Allan 29.03.2012 в 13:44
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>
    
ответ дан Ionuț G. Stan 18.06.2009 в 11:14
-1

Приятно улучшенная версия ответа Джонатана Финнга:

// 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 )

    
ответ дан Ates Goral 17.06.2009 в 21:18
  • Это не хорошо, потому что вы должны запустить функцию, чтобы получить свои аргументы. Вопрос состоял в том, чтобы получить аргументы из определения. –  Grégoire Cachet 30.11.2009 в 14:18