2009-05-27 20 views
17

Estoy buscando hacer el equivalente de Python inspect.getargspec() en Javascript.Inspeccionar los nombres/valores de los argumentos en la definición/ejecución de una función de JavaScript

sí sé que se puede obtener la lista arguments de una función de Javascript, pero lo que realmente estoy buscando es la 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 este análisis de una manera general?

Gracias por cualquier consejo.

Respuesta

22

Aunque 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

+0

Niza, gracias! Tengo algunas buenas razones para esto :) ... y están relacionadas principalmente con el deseo de replicar algunos códigos de Python que funcionan y que usan 'inspect.getargspec()', en JavaScript. – clemesha

+0

Todavía me pregunto si esta es la única forma de hacer una inspección así ... ¿No hay una manera más elegante? – clemesha

+0

nada que yo sepa, no. Ciertamente no es una forma común de hacer cosas en JavaScript. –

-1

agradable a la vista 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 solo funciona en navegadores compatibles con arguments.callee.

(Publicado también en How to get function parameter names/values dynamically from javascript)

+0

Esto no es bueno porque tienes que ejecutar la función para obtener sus argumentos. La pregunta era obtener argumentos de la definición. –

0

Aquí hay una versión que utiliza funciones de orden superior. Lo único que no me gusta es que debes especificar los parámetros como miembros de una matriz. Pero al menos solo deben especificarse 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> 
3

La siguiente función devolverá una matriz de nombres de parámetros de cualquier función aprobadas en el uso

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

Ejemplo:.

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