2009-05-27 9 views
17

Szukam odpowiednika Pythona inspect.getargspec() w JavaScript.Sprawdź nazwy/wartości argumentów w definicji/wykonywaniu funkcji JavaScript

wiem, że można uzyskać listę arguments z funkcji JavaScript, ale co ja naprawdę szukasz nazwy argumentów z pierwotnie określonej funkcji na.

Jeśli tak jest w rzeczywistości niemożliwe, będę musiał „brute-force” go przez coraz ciąg funkcji, tj myFunc.toString() a następnie analizowania zewnątrz ... wewnątrz function myFunc(...). Czy ktoś wie, jak to zrobić w sposób ogólny?

Dzięki za wszelkie wskazówki.

Odpowiedz

22

Chociaż nie widzę żadnego dobrego powodu tego,

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

zakładając func jest nazwa funkcji

+0

Nicea, dzięki! Mam ku temu dobre powody :) ... i są one głównie związane z chęcią replikowania działającego kodu Pythona, który używa 'inspect.getargspec()', w JavaScript. – clemesha

+0

Nadal się zastanawiam, czy to jedyny sposób na przeprowadzenie takiej inspekcji ... nie ma bardziej eleganckiego sposobu? – clemesha

+0

nic, co wiem, nie. Z pewnością nie jest to typowy sposób na robienie rzeczy w JavaScript. –

-1

sightly ulepszona wersja odpowiedzi Jonathan Fingland za:

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

Uwaga: działa to tylko w przeglądarkach obsługujących arguments.callee.

(pisał także na How to get function parameter names/values dynamically from javascript)

+0

To nie jest dobre, ponieważ musisz uruchomić funkcję, aby uzyskać jej argumenty. Chodziło o to, aby uzyskać argumenty z definicji. –

0

Oto wersja, która wykorzystuje funkcja wyższego rzędu. Jedyne, czego mi się nie podoba to to, że musisz podać parametry jako członkowie tablicy. Ale przynajmniej muszą być określone tylko raz.

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

następująca funkcja zwraca tablicy nazw parametrów jakiejkolwiek funkcji przekazywane w

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

przykład użycia.

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