Получить имя переменной. JavaScript "отражение" - PullRequest
6 голосов
/ 21 марта 2012

Есть ли способ получить переменную имя , как вы можете сделать в .Net с отражением?
как в этом сценарии:

function(x,y,z)
{
    if (x === 0)
        logger.log('variable ' + x.reflectedName ' has invalid value ' + x)
        // logs: 'variable x has invalid value 0)
    ...
}

Я нашел похожие вопросы, которые хотели получить имя переменной вне функции (?!), но не смог найти этот вопрос.

(jQuery - вариант, хотя я не могу думать, как это можно сделать с ним ...)

Ответы [ 4 ]

8 голосов
/ 12 января 2014

На самом деле вы CAN.Вот фрагмент кода:

function getVarName(v) {
    for (var key in window) {
        if (window[key] === v)
            return key;
    }
}
var testvar = 13142;
function test(t) {
    var varName = getVarName(t);
    // window[varName] -- your variable actualy
    alert(varName);
}
test(testvar); // testvar

Другая проблема заключается в том, что вы создаете несколько переменных, содержащих ту же самую переменную.Затем будет возвращена первая переменная.

7 голосов
/ 21 марта 2012

Поскольку вы используете .NET в качестве примера, давайте кратко рассмотрим это. В C # вы можете создать функцию, которая принимает Expression:

void BadArgument<T>(Expression<Func<T>> argExpr)
{
}

Но для того, чтобы иметь возможность извлечь имя переменной из вызова этой функции, вы должны убедиться, что в вызове всегда используется точно правильный синтаксис (даже если нет способа применить это во время компиляции):

if(x < 0)
    BadArgument(() => x);

Так что это можно сделать, но это очень хрупко и довольно медленно. В основном вы генерируете инструкции для создания целого дерева выражений на основе лямбда-выражения () => x, просто чтобы вызываемая функция могла разобрать это дерево выражений и попытаться найти имя аргумента.

Можно ли сделать подобные вещи в javascript? Конечно!

В javascript замыкания создаются с помощью внутренних функций, поэтому эквивалент лямбда-выражения, приведенного выше, будет:

function(){return x;}

И поскольку javascript является языком сценариев, каждая функция является эквивалентом ее собственного определения в виде строки. Другими словами, вызов .toString() для вышеуказанной функции даст:

function(){return x;}

Этот jsfiddle показывает , как вы можете использовать это в функции стиля ведения журнала. Затем вы можете анализировать результирующую строку функции, что будет лишь немного более трудным, чем анализ дерева выражений .NET. Более того, фактическое значение из x даже проще, чем в .NET: вы просто вызываете функцию !

Но только потому, что вы можете сделать это, это не значит, что вы должны . Это хорошо, как прием в мастерской, но когда все подходит Впрочем, оно того не стоит:

  • Это хрупко: что, если какой-то разработчик не использует его правильно и дает вам функцию, которую вы не можете разобрать?
  • Это не работает с минимизацией: представьте, что вы получаете сообщение о том, что переменная a имеет неправильное значение, потому что ваша минимизированная функция изменила имена ваших переменных.
  • Это добавляет накладные расходы: даже уменьшитель не может сократить function(){return x;}, чтобы быть меньше, чем "x".
  • Наконец, это сложно. 'ничего не сказал.
6 голосов
/ 21 марта 2012

Вы не можете. Но так как вы уже знаете имя переменной (поскольку вы должны использовать его для конкатенации его до конца строки), почему бы просто не ввести его?

т.е..

logger.log('variable x has invalid value '+x);
0 голосов
/ 01 июня 2015

Имя переменной легко получить

//This is variable you want to get the name
var prop;

var obj = {prop};
for(var propName in obj){
  alert(propName);
  break;
}

также вы можете попробовать здесь .

Отредактированный

Спасибо за комментарий @ Brady

Object.keys ({variableName}) [0] даст вам имя переменной.

function(x,y)
{
    const key = (obj) => Object.keys(obj)[0];

    if (x === 0)
        logger.log('variable ' + key({x}) + ' has invalid value ' + x)
        // logs: 'variable x has invalid value 0)
    if (y === 0)
        logger.log('variable ' + key({y}) + ' has invalid value ' + y)
        // logs: 'variable y has invalid value 0)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...