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] */
Если ваша переменная уже является массивом, просто добавьте имя в последнюю позицию в массиве.