Dado que está utilizando .NET como ejemplo, vamos a profundizar brevemente en eso. En C#, puede crear una función que toma un Expression
:
void BadArgument<T>(Expression<Func<T>> argExpr)
{
}
Pero con el fin de ser capaz de extraer el nombre de variable de una llamada a esta función, usted tendría que asegurarse de que la llamada utiliza siempre exactamente la sintaxis correcta (a pesar de que no hay manera de hacer cumplir esta en tiempo de compilación):
if(x < 0)
BadArgument(() => x);
por lo que se puede hacer, pero es muy frágil y bastante lento. Básicamente está generando instrucciones para crear un árbol de expresiones completo basado en la expresión lambda () => x
, solo para que la función a la que llama pueda analizar ese árbol de expresiones e intentar encontrar el nombre del argumento.
¿Se puede hacer este tipo de cosas en javascript? ¡Por supuesto!
en JavaScript, cierres se producen a través de las funciones internas, por lo que el equivalente de la expresión lambda anterior sería:
function(){return x;}
Y puesto que JavaScript es un lenguaje de script, cada función es el equivalente de su propia definición como una cadena. En otras palabras, llamando .toString()
en la función anterior cederán:
function(){return x;}
This jsfiddle shows cómo puede aprovechar esto en una función de estilo de registro. A continuación, puede analizar la cadena de funciones resultante, lo que será un poco más problemático que el análisis del .NET Expression Tree. Además, obtener el valor real de x
es incluso más fácil que en .NET: ¡solo call the function!
Pero sólo porque usted puede do que no se debe significar. Es agradable como un truco de salón recórcholis, pero cuando se trata a fin de cuentas, no vale la pena:
- Es frágil: ¿y si algún desarrollador no utiliza bien y le da una función que no puedes analizar?
- No funciona con minimización: Imagínese tener un mensaje de esa variable
a
tenían un valor incorrecto debido a que su función minified cambió sus nombres de variables.
- Se agrega sobrecarga: incluso un Minifier no puede acortar
function(){return x;}
a ser menor que "x"
.
- Finalmente, es complicado. 'dijo nuff.
Vale la pena señalar: no se puede obtener un nombre de variable a través de la reflexión en .NET. – StriplingWarrior
@StriplingWarrior. puedes hacerlo con 'Expression'. Lo simplifico para ninguno .Net developers ... – gdoron
¿por qué no solo registras tu nombre de variable en la cadena? en su ejemplo, sería igual de fácil poner x en la cadena 'console.log ('variable x tiene valor no válido:', x)' – SpYk3HH