2009-05-27 4 views
17

Je cherche à faire l'équivalent de inspect.getargspec() de Python en Javascript.Inspecter les noms/valeurs d'arguments dans la définition/exécution d'une fonction JavaScript

Je ne sais que vous pouvez obtenir la liste arguments d'une fonction Javascript, mais ce que je suis vraiment pour est le nom des arguments de la fonction définie à l'origine.

Si cela est en fait impossible, je vais devoir « force brute » en obtenant la chaîne de la fonction, à savoir myFunc.toString() puis analyse le ... intérieur de function myFunc(...). Est-ce que quelqu'un sait comment faire cette analyse d'une manière générale?

Merci pour tous les conseils.

Répondre

22

Bien que je ne vois aucune bonne raison pour cela,

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

en supposant func est le nom de votre fonction

+0

Nice, merci! J'ai quelques bonnes raisons pour cela :) ... et ils sont principalement liés au fait de vouloir répliquer du code Python qui utilise 'inspect.getargspec()', en JavaScript. – clemesha

+0

Je me demande encore si c'est la seule façon de faire une telle inspection ... il n'y a pas de manière plus élégante? – clemesha

+0

rien que je sache, non. Ce n'est certainement pas un moyen courant de faire des choses en JavaScript. –

-1

Version Sightly améliorée de la réponse 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); 

Remarque: Cela ne fonctionne que sur les navigateurs prenant en charge arguments.callee.

(également affiché à How to get function parameter names/values dynamically from javascript)

+0

Ce n'est pas bon parce que vous devez exécuter la fonction pour obtenir ses arguments. La question était d'obtenir des arguments de la définition. –

0

est ici une version qui utilise des fonctions d'ordre supérieur. La seule chose que je n'aime pas c'est que vous devez spécifier les paramètres en tant que membres d'un tableau. Mais au moins, ils ne doivent être spécifiés qu'une seule fois.

<!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 fonction suivante retourne un tableau de noms de paramètres de toute fonction passée dans

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

Exemple d'utilisation:.

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