Inspiser navn / verdier av argumenter i definisjonen / gjennomføring av en Javascript-funksjon

stemmer
17

Jeg ønsker å gjøre tilsvarende Pythons inspect.getargspec()i Javascript.

Jeg vet at du kan få argumentsliste fra en Javascript-funksjon, men det jeg egentlig leter etter er navnene på de argumentene fra opprinnelig definert funksjon.

Hvis dette er faktisk umulig, jeg kommer til å 'brute-force' det ved å få strengen av funksjonen, dvs. myFunc.toString()og deretter analyse ut ...inni function myFunc(...). Vet noen hvordan du gjør dette parsing på en generell måte?

Takk for alle tips.

Publisert på 27/05/2009 klokken 10:14
kilden bruker
På andre språk...                            


5 svar

stemmer
22

Selv om jeg ikke kan se noen god grunn for dette,

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

antar funcer navnet på funksjonen

Svarte 27/05/2009 kl. 10:28
kilden bruker

stemmer
-1

Sightly forbedret versjon av Jonathan Fingland svar:

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

Merk: Dette fungerer bare på nettlesere som støtter arguments.callee.

(Også postet på Hvordan komme funksjon parameternavn / verdier dynamisk fra javascript )

Svarte 17/06/2009 kl. 19:18
kilden bruker

stemmer
0

Her er en versjon som bruker høyere ordens funksjoner. Det eneste jeg ikke liker med det er at du må spesifisere parametere som medlemmer av en matrise. Men minst de bare må oppgis en gang.

<!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>
Svarte 18/06/2009 kl. 09:14
kilden bruker

stemmer
4

her en liten nodejs modul for det.

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

Svarte 22/11/2011 kl. 10:03
kilden bruker

stemmer
3

Følgende fremgangsmåte vil returnere en matrise av parameter navn på en hvilken som helst funksjon ført inn.

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

Eksempler på bruk:

getParamNames(getParamNames) // returns ['func']
getParamNames(function (a,b,c,d){}) // returns ['a','b','c','d']
Svarte 29/03/2012 kl. 11:44
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more