2012-04-23 33 views
8

Voglio creare una funzione di registro in cui posso inserire i nomi delle variabili in questo modo:Ottenere i nomi delle variabili con JavaScript

var a = '123', 
    b = 'abc'; 

log([a, b]); 

E il risultato dovrebbe essere simile nel console.log

a: 123 
b: abc 

Ottenere il valore della variabile non è un problema, ma come ottengo i nomi delle variabili? La funzione dovrebbe essere generica, quindi non posso sempre presumere che l'ambito sia una finestra.

+4

Questo non è possibile in Javascript come si desidera che funzioni. Con qualcosa come "var foo = bar = {}" lo stesso oggetto viene chiamato con 2 nomi, e se si passa l'oggetto in una funzione è impossibile dall'interno della funzione per invertire quella ricerca e vedere quale nome è stato usato per passare in. – Gareth

+0

Ok, allora posso smettere di cercare. Grazie! – arpo

+0

Invece, dovresti imparare come usare un debugger. Inizia mettendo una riga contenente solo debugger invece della tua linea console.log, quindi esegui il tuo codice con Firebug o Chrome Inspector aperto – Gareth

risposta

6

così l'argomento è un array di variabili ? allora no, non c'è modo di ottenere il nome della variabile originale una volta che è passato in quel modo. nel lato di ricezione, basta guardare come:

["123","abc"]; 

e niente di più


si potrebbe fornire la funzione i nomi delle variabili e l'ambito cui si trovano, come:

function log(arr,scope){ 
    for(var i=0;i<arr.length;i++){ 
     console.log(arr[i]+':'scope[arr[i]]); 
    } 
} 

tuttavia, questo si verifica nel problema se si può fornire l'ambito anche. ci sono un sacco di problemi di ciò che this è in alcune zone di codice:

  • per le funzioni nonstrict, this è window
  • per le funzioni severe, this è undefined
  • per funzioni di costruzione, this è il costruito oggetto
  • all'interno di un oggetto letterale, this è l'oggetto di chiusura immediato

pertanto non è possibile fare affidamento sul passaggio dello this come ambito. a meno che non sia possibile fornire l'ambito, questo è un altro vicolo cieco.


se li si passa come un oggetto, è possibile scorrere l'oggetto e le sue "chiavi" e non i nomi delle variabili originali. tuttavia, in questo caso è più un danno che una cura.

0

Non so se questo sarebbe davvero lavorare in JS ... ma è possibile utilizzare un oggetto, in cui è possibile memorizzare il nome e il valore:

function MyLogObject(name, value) { 
    this.name = name; 
    this.value = value; 
    } 


    var log = []; 
    log.push(new MyLogObject('a', '123')); 
    log.push(new MyLogObject('b', 'abc')); 

    for each (var item in log) { 
    if (item.value != undefined) 
     alert(item.name + "/" + item.value);  
    } 

Poi si può ciclo attraverso questo oggetto e è possibile ottenere il nome e il valore

+0

Nessun oggetto non è quello che sto cercando. – arpo

0

Non è possibile accedere ai nomi di variabile utilizzando una matrice. Che cosa si potrebbe fare è utilizzare oggetti o passare i nomi delle variabili come String:

var x = 7; 
var y = 8; 

function logVars(arr){ 
    for(var i = 0; i < arr.length; i++){ 
     alert(arr[i] + " = " + window[arr[i]]); 
    } 
} 

logVars(["x","y"]); 
+0

* "la funzione dovrebbe essere generica, quindi non posso sempre presumere che l'ambito sia una finestra." * Dice l'OP. – Joseph

+0

Conosco un array e un oggetto funziona. Ma voglio risparmiare i colpi di chiave, vedi risposta sopra. E non posso pensare che l'ambito sia una finestra. In effetti io uso lo scope della finestra il meno possibile. – arpo

1

qualcosa di simile sarebbe fare quello che stai cercando:

function log(logDict) { 
    for (var item in logDict) { 
     console.log(item + ": " + logDict[item]); 
    } 
} 

function logSomeStuff() { 
    var dict = {}; 
    dict.a = "123"; 
    dict.b = "abc"; 
    log(dict); 
} 

logSomeStuff(); 
+0

So che posso usare un oggetto. Quello che voglio fare è salvare i colpi di chiave quando sto lavorando. Voglio vedere rapidamente che cos'è un mucchio di variabili. Se devo metterli in un oggetto ottengo colpi di chiave ma di un altro tipo :) Sono stanco di digitare console.log ('a:' + a 'b:' + b); e vogliono una funzione per gestirlo. – arpo

+0

In tal caso, si incontrano i problemi relativi all'ambito che @Joseph menziona nella sua risposta. –

2

So che vuoi salvare alcuni tasti. Anche a me. Tuttavia, di solito registro il nome della variabile e i valori molto simili agli altri qui hanno già suggerito.

console.log({a:a, b:b}); 

Se davvero si preferisce il formato che già illustrato, allora si può fare in questo modo:

function log(o) { 
    var key; 
    for (key in o) { 
     console.log(key + ":", o[key]); 
    } 
} 

var a = '1243'; 
var b = 'qwre'; 
log({ 
    a:a, 
    b:b 
}); 

In entrambi i casi, avresti bisogno di includere il nome della variabile nella richiesta di registrazione, se tu vuoi vederlo. Come ha detto Gareth, vedere i nomi delle variabili all'interno della funzione chiamata non è un'opzione.

+0

Sì, forse è il massimo che posso ottenere. – arpo

-2

testare questo.

var variableA="valor01"; <br> 
var variableB="valor02"; 

var NamevariableA=eval('("variableA")');<br> 
var NamevariableB=eval('("variableB")');<br> 

console.log(NamevariableA,NamevariableB); 

atte. Manuel Retamozo Arrué

0

Ho avuto un problema simile, ma per ragioni diverse.

La soluzione migliore che ho trovato è stato:

MyArray = ["zero","one","two","three","four","five"]; 
MyArray.name="MyArray"; 

Quindi, se:

x=MyArray.name; 

Poi:

X=="MyArray" 

Come ho detto, si adatta alle mie esigenze, ma non è sicuro COME FUNZIONA PER TE. Mi sento sciocca che ne avessi avuto bisogno, ma l'ho fatto.

Problemi correlati