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".

Ответ 1

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

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

Ответ 2

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

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

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

Так как console.log показывает Object с их key и value Propertiy/ies, вы можете использовать его, чтобы увидеть имя и значение вашей переменной, вызвав 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})

Ответ 3

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

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

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

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

Ответ 4

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

Лучшей альтернативой, которую я могу придумать, является передать объект 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});
}

Ответ 5

Мне понравилась идея @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();

Ответ 6

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

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

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

Ответ 7

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

var name = "John"; //Original. No way to get the name

var name = ["John", "name"]; /*My way. Variable input will be at name[0] and name
name[1] */

Если ваша переменная уже является массивом, просто добавьте имя в последнюю позицию в массиве.