Inspeccionar los nombres / valores de los argumentos en la definición / ejecución de una función JavaScript

StackOverflow https://stackoverflow.com/questions/914968

Pregunta

Estoy buscando para hacer el equivalente de inspect.getargspec() de Python en Javascript.

Yo sé que se puede obtener la lista arguments de una función de Javascript, pero lo que realmente estoy buscando es el nombres de los argumentos de la función definida originalmente.

Si esto es imposible, de hecho, voy a tener que 'fuerza bruta' por conseguir la cadena de la función, es decir myFunc.toString() y luego analizar el interior de ... function myFunc(...). ¿Alguien sabe cómo hacer esto el análisis sintáctico de una manera general?

Gracias por cualquier consejo.

¿Fue útil?

Solución

Si bien no puedo ver ninguna buena razón para esto,

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

asumiendo func es el nombre de la función

Otros consejos

aquí un pequeño módulo de nodejs para eso.

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

La siguiente función devolverá un array de nombres de los parámetros de cualquier función se ha pasado.

function getParamNames(func) {
    var funStr = func.toString();
    return funStr.slice(funStr.indexOf('(')+1, funStr.indexOf(')')).match(/([^\s,]+)/g);
}

Ejemplo de uso:

getParamNames(getParamNames) // returns ['func']
getParamNames(function (a,b,c,d){}) // returns ['a','b','c','d']

Aquí hay una versión que utiliza funciones de orden superior. La única cosa que no me gusta de ella es que usted tiene que especificar parámetros como miembros de una matriz. Pero, al menos, sólo tienen que ser especificado una vez.

<!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>

vistoso mejorada versión de la respuesta de 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);

Nota: Esto sólo funciona en navegadores que soportan arguments.callee

.

(Publicado también en Cómo para obtener nombres de los parámetros de función / valores dinámicamente desde javascript )

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top