2012-04-23 2 views
8

Я хочу создать функцию журнала, где я могу вставить имена переменных, как это:Получить имена переменных с JavaScript

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

log([a, b]); 

И результат должен выглядеть в console.log

a: 123 
b: abc 

Получить значение переменной - никаких проблем, но как получить имена переменных? Функция должна быть общей, поэтому я не всегда могу предположить, что область - это окно.

+4

Это невозможно в Javascript, так как вы хотите, чтобы он работал. Что-то вроде 'var foo = bar = {}' тот же объект упоминается двумя именами, и если вы просто передаете объект в функцию, изнутри функции невозможно отменить этот поиск и посмотреть, какое имя было использовано для передачи он в. – Gareth

+0

Хорошо, тогда я могу остановить поиск. Thanx! – arpo

+0

Вместо этого вы должны научиться использовать отладчик. Начните с размещения строки, содержащей отладчик вместо строки console.log, а затем запустите свой код с Firebug или Chrome Inspector open – Gareth

ответ

6

так что аргумент является массивом переменных ? то нет, нет способа получить исходное имя переменной, как только оно будет передано таким образом. в приемном конце, они просто выглядят как:

["123","abc"]; 

и ничего более


вы могли бы обеспечить функцию имена переменных и сферы они находятся, как:

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

Однако, это проблема, если вы может дать область также. Есть много вопросов, что this в некоторых областях коды:

  • для нестрогих функций, this является window
  • для строгих функций, this является undefined
  • для функций конструктора, this является сконструированным объект
  • в объектном лите, this является неотъемным предметом объекта

поэтому вы не можете положиться на прохождение this в качестве области. если вы не можете предоставить объем, это еще один тупик.


, если передать их в качестве объекта, то вы можете перебирать объекта и его «ключи», а не оригинальные имена переменных. однако в этом случае это больший ущерб, чем лечение.

0

Не знаю, если это будет действительно работать в JS ... но вы можете использовать объект, в котором вы можете хранить имя и значение:

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

Затем вы можете петлю через этот объект и вы можете получить имя и значение

+0

Нет объекта, которого я не ищу. – arpo

0

Вы не можете получить доступ к именам переменных с помощью массива. Что вы можете сделать, это использовать объекты или передать имена переменных в виде строки:

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

* «функция должна быть общей, поэтому я не всегда могу предположить, что область видимости - это окно». OP говорит. – Joseph

+0

Я знаю, что массив и объект работают. Но я хочу сохранить ключевые штрихи, см. Ответ выше. И я не могу предположить, что область - это окно. Фактически я использую область окна как можно меньше. – arpo

1

Что-то, как это будет делать то, что вы ищете:

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

Я знаю, что могу использовать объект. Я хочу, чтобы сохранить ключевые штрихи, когда я работаю. Я хочу быстро увидеть, что такое куча переменных. Если мне нужно поместить их в объект, я получаю ключевые штрихи, но другого типа :) Я устал печатать console.log ('a:' + a 'b:' + b); и хотите, чтобы функция обрабатывала это. – arpo

+0

В этом случае вы сталкиваетесь с проблемами, связанными с возможностями, которые @Joseph упоминает в его ответе. –

2

Я знаю, что вы хотите сохранить несколько нажатий клавиш. Я тоже. Тем не менее, я обычно регистрирую имя переменной и значения, подобные тем, которые здесь уже предложены.

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

Если вы действительно предпочитаете формат, который вы уже проиллюстрированную, то вы можете сделать это следующим образом:

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

В любом случае, вам нужно включить имя переменной в запросе регистрации, если вы хотите это увидеть. Как сказал Гарет, видение имен переменных внутри вызываемой функции не является опцией.

+0

Да, возможно, это самое близкое, что я могу получить. – arpo

-2

проверить это.

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

У меня была несколько схожая проблема, но по разным причинам.

Лучшее решение, которое я смог найти:

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

Так что если:

x=MyArray.name; 

Тогда:

X=="MyArray" 

Как я уже сказал, он подходит моим потребностям, но не уверен, КАК это будет работать для вас. Я чувствую себя глупо, что мне даже это нужно, но я это сделал.

Смежные вопросы