Поскольку вы используете .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"
.
- Наконец, это сложно. 'ничего не сказал.