Ponieważ używasz .NET jako przykład, załóżmy, że na chwilę zagłębić. W C#, można utworzyć funkcję, która bierze Expression
:
void BadArgument<T>(Expression<Func<T>> argExpr)
{
}
Jednak aby móc wyodrębnić nazwę zmiennej z wywołania tej funkcji, trzeba by upewnić się, że rozmowa zawsze używa dokładnie prawo składni (chociaż nie ma sposobu, aby egzekwować to w czasie kompilacji):
if(x < 0)
BadArgument(() => x);
Więc można to zrobić, ale to jest bardzo delikatne i bardzo powolny. Generalnie generujesz instrukcje, aby utworzyć całe drzewo wyrażeń oparte na wyrażeniu lambda () => x
, więc funkcja, którą wywołujesz, może przeanalizować to drzewo wyrażeń i spróbować znaleźć nazwę argumentu.
Czy można tego dokonać w javascript? Pewnie!
w JavaScript, zamknięcia są wytwarzane poprzez funkcje wewnętrzne, więc odpowiednikiem powyższego wyrażenia lambda byłoby:
function(){return x;}
A ponieważ JavaScript jest językiem skryptowym, każda funkcja jest równoznaczne z jego własnej definicji jako ciąg. Innymi słowy, nazywając .toString()
na powyższej funkcji przyniesie:
function(){return x;}
This jsfiddle shows jak można wykorzystać to w funkcji rejestrowania stylu. Następnie możesz parsować wynikowy ciąg funkcyjny, który będzie tylko trochę bardziej kłopotliwy niż analizowanie drzewa .NET Expression. Ponadto uzyskanie rzeczywistej wartości o wartości z x
jest jeszcze łatwiejsze niż w .NET: po prostu call the function!
Ale tylko dlatego, że może robią to nie znaczy, że powinien. Miło jako gee-whiz salonu podstęp, ale gdy przychodzi co do czego, to nie warto:
- To kruche: co jeśli jakiś deweloper nie używać go w prawo i daje funkcję nie możesz parsować?
- Nie działa w przypadku zminimalizowania: wyobraź sobie otrzymanie komunikatu, że zmienna
a
ma niepoprawną wartość, ponieważ minifunkcjonowana funkcja zmieniła nazwy zmiennych.
- Dodaje narzut: nawet minifier nie może skrócić
function(){return x;}
, aby być mniejszym niż "x"
.
- Wreszcie, jest to skomplikowane. - powiedział nuff.
Warto zwrócić uwagę: nie można uzyskać nazwy zmiennej poprzez odbicie w .NET. – StriplingWarrior
@StriplingWarrior. możesz z 'Expression' uprościć go dla żadnego deweloperów .Net ... – gdoron
dlaczego nie po prostu zapisać nazwy zmiennej w ciągu znaków? w twoim przykładzie równie łatwo byłoby umieścić x w ciągu 'console.log ('zmienna x ma nieprawidłową wartość:', x)' – SpYk3HH