2011-03-22 23 views
10

Quiero crear una función rápida que tendrá console.log un nombre de variable y el valor. Me gustaría que el resultado de la función se muestre en la consola: foo: bar.Javascript: Haga referencia a un nombre de variable de la variable en sí

Mi idea básica de la función tiene el siguiente aspecto:

function varlog(var_name) 
{ 
    console.log(var_name + ": " + eval(var_name)); 
} 

Y es que yo llamaría así:

function someRandomFunction() 
{ 
    var foo = "bar"; 
    // ... some stuff happens 
    varlog("foo"); 
} 

Esto funciona si foo es global, pero no funciona en el ejemplo proporcionado. Otra opción que también solo funciona globalmente es usar window[var_name] en lugar de la aterradora eval.

No creo que lo que estoy pidiendo sea posible, pero pensé que lo tiraría allí.

Estoy pasando mucho tiempo tratando de ser flojo. Mi método actual es solo console.log('foo: ' + bar); que funciona bien. Pero ahora solo quiero saber si esto es posible.

Algunas otras preguntas que hace referencia en la búsqueda de este/creación de lo que tengo ahora:

-

Editar: Me encantaría simplemente llamar al varlog(foo), si el nombre "foo" puede derivarse de la variable.

+2

esta pregunta también: http://stackoverflow.com/questions/1009911/javascript-get-argument-value-and-name-of-passed-variable – manji

+0

@najmeddine he prácticamente duplica eso con mejor formateo. Doh! Gracias :) – hookedonwinter

+0

Podría extender javascript para convertir todas las asignaciones var 'var foo =" bar ";' a 'var foo = {foo:" bar "};' (sobre todo bromeando) (en su mayoría) – hookedonwinter

Respuesta

4

La razón por la que no funciona es porque la variable foo no es accesible para la función varlog! foo se declara en alguna función aleatoria, y nunca se pasa al varlog, por lo que varlog no tiene idea de cuál es la variable foo. Puede resolver este problema pasando la variable foo a la función (o usando algún tipo de cierre para hacer foo en el alcance de varlog) junto con su representación de cadena, pero de lo contrario, creo que no tiene suerte.

Espero que esto ayude.

+0

Eso es lo que Estoy asumiendo que me pregunto si alguien tiene un enfoque ridículo al respecto. Porque llamar a 'varlog (" foo ", foo);' funcionaría, pero en realidad no ahorra mucho tiempo en 'console.log ('foo:' + foo);' – hookedonwinter

+0

Correcto, bueno después de mirar un poco más, Creo que no podrás lograr esto.¿Estás buscando azúcar sintaxis? – idbentley

+0

Simplemente siendo flojo. Es lo diferente de 'varlog (foo);' y 'console.log ('foo:' + foo);'. – hookedonwinter

2

No creo que lo que quieres hacer es posible.

La mejor alternativa que se me ocurre es pasar un objeto a varlog que es básicamente un hash de clave-valor:

function varlog(obj) 
{ 
    for (var varname in obj) { 
     console.log(varname + ": " + obj[varname]); 
    } 
} 


function someRandomFunction() 
{ 
    var foo = "bar"; 
    // ... some stuff happens 
    varlog({foo: foo}); 
} 
+0

Eso funciona totalmente, pero el pensamiento no tiene los beneficios de ahorro de tiempo de solo pasar el nombre de la variable una vez. Similar a simplemente llamar a 'varlog (" foo ", foo);'. Pero, ¡funciona! :) – hookedonwinter

3

Aunque no estoy al tanto de esa posibilidad, hubiera querido comparta una pequeña idea:

Object.prototype.log = function(with_message) { 
    console.log(with_message + ":" + this); 
} 

var x = "string"; 
x.log("x"); 

Como dije, una pequeña idea.

0

Me encantó @mhitza idea, así que lo estoy haciendo un poco más grande ...

El inconveniente es la necesidad de utilizar .value para alcanzar el contenido variable.

Object.prototype.log = function(message) { 
 
    if (message) console.log(this.name, this.value, message); 
 
    else console.log(this.name, this.value); 
 
} 
 

 
function nar (name, value) { 
 
    var o = {name: name, value: value}; 
 
    this[name] = o; 
 
    return o; 
 
} 
 

 
// var globalVar = 1; 
 
nar('globalVar', 1); 
 

 
globalVar.log(); 
 
// > globalVar 1 
 

 
globalVar.value += 5; 
 

 
globalVar.log('equal six'); 
 
// > globalVar 6 equal six 
 

 
var someFunction = function() { 
 
    // var localVar = 2; 
 
    nar('localVar', 2); 
 

 
    localVar.log('someInfo'); 
 
    // > localVar 2 someInfo 
 
}; 
 

 
someFunction();

2

Solución - (para su caso de uso real) - console.log({foo})

En están siendo aceptadas ES6IdentifierReference s como PropertyDefinition s en el ObjectLiteral 's PropertyDefinitionList (see compatibility chart):

El nombre de la variable se establece en 'Property s' s el Objectkey
y la variable valor está siendo puesto a 'Property s' s value la Object.

Como console.log muestra Object s con sus Propertiy/IES key s y s value puede utilizar eso para ver tanto de la variable de nombre y valor invocando console.log({foo}).

Tenga en cuenta que al inicializar una sola anónima object con varios las variables como lo hice en la segunda console.log mientras aparecen en el mismo orden que inicializado aquí en la producción del fragmento que podrían consiguen reordenado (alfabéticamente) en otros lugares .

var testint = 3 
 
var teststring = "hi" 
 
var testarr = ["one", 2, (function three(){})] 
 
var testobj = {4:"four", 5:"five", nested:{6:"six",7:"seven"}} 
 
console.log({testint}) 
 
console.log({testint, teststring, testarr, testobj})

respuesta - (al título de la pregunta) - Object.keys({foo})[0]

También puede emplear sus abreviaturas Object Initializer junto con Object.keys() acceder a la recta del nombre de la variable:

var name = "value" 
 
console.log(Object.keys({name})[0])

Cuestiones relacionadas