w3schools valor una tipos retornar pasar parametros funciones funcion desde anonimas anidadas javascript reflection methods

tipos - retornar valor de una funcion javascript



¿Es posible reflejar los argumentos de una función Javascript? (7)

¿Es posible obtener todos los argumentos que una función de Javascript está escrita para aceptar? (Sé que todos los argumentos de la función Javascript son "opcionales") Si no, ¿es posible obtener el número de argumentos? Por ejemplo, en PHP, uno podría usar:

$class = new ReflectionClass(''classNameHere''); $methods = $class->getMethods(); foreach ($methods as $method) { print_r($method->getParameters()); }

... o algo así, no he tocado PHP desde hace un tiempo, por lo que el ejemplo anterior puede no ser correcto.

¡Gracias por adelantado!

EDITAR: Lamentablemente, tengo que ser capaz de obtener los argumentos fuera del cuerpo de la función ... Lo siento por la falta de aclaración, pero gracias por las respuestas actuales!


Ahora cuando dices fuera del cuerpo de la función , solo puedo imaginar que quieres saber cuáles son los nombres de los parámetros. Porque en lo que respecta a los valores, ya sabes qué argumentos estás aprobando. Otras respuestas han dicho que puede obtener la duración de la función, que es la cantidad de parámetros que declara explícitamente. Ahora, si quiere saber los nombres fuera de la función, ¿qué tal el hack toString ?

Considerar

function f(oh, hi, there) { return hi + there / oh; }

Entonces

alert(f);

¿Que ves? ¡Correcto, solo regexalos! Está bien, LO SIENTO para mencionar esto. Tal vez no es ECMAScript estándar, pero funciona en Chrome ....


Esta nueva versión también maneja las funciones de la flecha fat ...

args = f => f.toString ().replace (/[/r/n/s]+/g, '' ''). match (/(?:function/s*/w*)?/s*(?:/((.*?)/)|([^/s]+))/). slice (1,3). join (''''). split (//s*,/s*/); function ftest (a, b, c) { } let aftest = (a, b, c) => a + b / c; console.log ( args (ftest), // = ["a", "b", "c"] args (aftest), // = ["a", "b", "c"] args (args) // = ["f"] );

Esto es lo que creo que estás buscando:

function ftest (a, b, c) { } var args = ftest.toString (). replace (/[/r/n/s]+/g, '' ''). match (/function/s*/w*/s*/((.*?)/)/)[1].split (//s*,/s*/);

args será una matriz de los nombres de los argumentos de prueba, es decir [''a'', ''b'', ''c'']

El valor es args será una matriz de los nombres de los parámetros si la ftest es una función. La matriz estará vacía si ftest no tiene parámetros. El valor de args será null si ftest falla la coincidencia de expresión regular, es decir, no es una función.


JavaScript es un dialecto de ECMAScript, de acuerdo con el estándar ECMAScript, una función es también un objeto, y cuando se llama a una función, la función puede acceder a argumentos, este argumento es un objeto tipo array, tiene propiedad de longitud, por lo que puede usar argumentos .length para recorrer todos los argumentos pasados ​​a esta función. visita http://interglacial.com/javascript_spec/a-13.html#a-13.2.1 para más detalles.


La respuesta de HBP es lo que la mayoría de la gente está buscando, pero si usted es el que define la función, también puede asignar una propiedad al objeto de función. Por ejemplo,

a.arguments = [''foo'', ''bar'', ''baz''] function a(foo, bar, baz) { // do stuff }

Esto es discutiblemente más claro, pero tendrás que escribir tus argumentos dos veces.


Supongamos que su nombre de función es foo

¿Es posible obtener todos los argumentos que una función de Javascript está escrita para aceptar?

arguments[0] a arguments[foo.length-1]

Si no, ¿es posible obtener el número de argumentos?

foo.length funcionaría


es posible obtener todo el nombre del parámetro formal de un javascript:

var FN_ARGS = /^function/s*[^/(]*/(/s*([^/)]*)/)/m; var FN_ARG_SPLIT = /,/; var FN_ARG = /^/s*(_?)(/S+?)/1/s*$/; var STRIP_COMMENTS = /((////.*$)|(///*[/s/S]*?/*//))/mg; function formalParameterList(fn) { var fnText,argDecl; var args=[]; fnText = fn.toString().replace(STRIP_COMMENTS, ''''); argDecl = fnText.match(FN_ARGS); var r = argDecl[1].split(FN_ARG_SPLIT); for(var a in r){ var arg = r[a]; arg.replace(FN_ARG, function(all, underscore, name){ args.push(name); }); } return args; }

esto puede ser probado de esta manera:

var expect = require(''expect.js''); expect( formalParameterList(function() {} )).to.eql([]); expect( formalParameterList(function () {} )).to.eql([]); expect( formalParameterList(function /* */ () {} )).to.eql([]); expect( formalParameterList(function (/* */) {} )).to.eql([]); expect( formalParameterList(function ( a, b, c ,d /* */, e) {} )).to.eql([''a'',''b'',''c'',''d'',''e'']);

Nota: Esta técnica se usa con $ inyector de AngularJs y se implementa en la función anotar. (Consulte https://github.com/angular/angular.js/blob/master/src/auto/injector.js y la prueba de unidad correspondiente en https://github.com/angular/angular.js/blob/master/auto/injectorSpec.js )


revisa solo los caracteres requeridos. con func.toString (). regex marcó full length.so si la función es clase con 500 líneas de código ...

function getParams(func){ var str=func.toString(); var len = str.indexOf("("); return str.substr(len+1,str.indexOf(")")-len -1).replace(/ /g,"").split('','') }