Javascript: ссылка на имя переменной из самой переменной

Я хочу создать быструю функцию, которая будет console.log имя переменной и значение. Я хотел бы, чтобы результат функции отображался в консоли: foo: bar,

Моя основная идея для функции выглядит следующим образом:

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

И я бы назвал это так:

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

Это работает, если foo является глобальным, но не работает в приведенном примере. Другой вариант, который также работает только в глобальном масштабе, использует window[var_name] вместо страшного eval,

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

Я провожу много времени, пытаясь быть ленивым. Мой текущий метод просто console.log('foo: ' + bar); который работает просто отлично. Но сейчас я просто хочу знать, возможно ли это.

Некоторые другие вопросы, на которые я ссылался при поиске этого / создании того, что у меня есть сейчас:

-

Изменить: я хотел бы просто позвонить varlog(foo), если имя "foo" может быть получено из переменной.

6 ответов

Решение

Причина этого не в том, что переменная foo недоступен для функции varlog! foo объявляется в someRandomFunction и никогда не передается в varlog, так varlog понятия не имеет, что такое переменная foo! Вы можете решить эту проблему, передав переменную foo в функцию (или используя какое-то закрытие, чтобы сделать foo в объеме varlog) вместе с его строковым представлением, но в остальном, я думаю, вам не повезло.

Надеюсь это поможет.

Решение - (для вашего реального случая использования) - console.log({foo})

В ES6 IdentifierReference с принимаются как PropertyDefinition на ObjectLiteral "s PropertyDefinitionList ( см. таблицу совместимости):

Имя переменной устанавливается на Object "s Property "s key
и значение переменной устанавливается на Object "s Property "s value,

Как console.log шоу Object с их Propertiy / е годы key с и value s вы можете использовать это, чтобы увидеть имя и значение вашей переменной, вызвав console.log({foo}),

Обратите внимание, что при инициализации одного анонимного object с несколькими переменными, как я сделал во втором console.log хотя они отображаются в том же порядке, что и инициализированы здесь в выводе фрагмента, они могут быть переупорядочены (в алфавитном порядке) в другом месте.

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

Ответ - (к названию вопроса) - Object.keys({foo})[0]

Вы также можете использовать эту стенографию Object Initializer вместе с Object.keys() для прямого доступа к имени переменной:

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

Хотя я не знаю о такой возможности, я хотел бы поделиться небольшой идеей:

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

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

Как я уже сказал, маленькая идея.

Вид объединения пары ответов в маленькую функцию

Будет ли это работать для вас?

const log = function() {
  const key = Object.keys(this)[0];
  const value = this[key];
  console.log(`${key}: ${value}`);
}

let someValue = 2;

log.call({someVlaue}); //someValue: 2

Работает с функцией тоже, даже сама.

log.call({log});

// It would return the following
log:function() {
  const key = Object.keys(this)[0];
  const value = this[key];
  console.log(`${key}: ${value}`);
}

Я не верю, что то, что ты хочешь сделать, возможно.

Лучшая альтернатива, которую я могу придумать, - передать объект varlog это в основном хэш-ключ-значение:

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


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

Удивлен, что пока нет супер простого решения.

let varname = "banana"
console.log(`${JSON.stringify({varname}).split('"')[1]}`)

Печать varname в консоли

Мне понравилась идея @mhitza, поэтому я делаю ее немного больше...

Недостатком является необходимость использования .value чтобы достичь переменной содержимого.

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

Другие вопросы по тегам