Potrzebuję aktualnej nazwy funkcji jako ciąg do zalogowania się do naszego obiektu rejestru. Ale arguments.callee.name
działa tylko w trybie luźnym. Jak uzyskać nazwę funkcji pod numerem "use strict"
?Pobierz bieżącą nazwę funkcji w trybie ścisłym.
Odpowiedz
Dla celów rejestrowania/debugowania, można utworzyć nowy Error
obiekt w rejestratorze i skontrolować jego .stack
własności, np
function logIt(message) {
var stack = new Error().stack,
caller = stack.split('\n')[2].trim();
console.log(caller + ":" + message);
}
function a(b) {
b()
}
a(function xyz() {
logIt('hello');
});
Twoja odpowiedź jest nieco skomplikowana, ale pokazuje pomysł. – exebook
Świetna odpowiedź @georg. Zauważ, że '' [2] '' odnosi się tylko do tego przykładu, jeśli masz na przykład stos zawierający trzy funkcje rodzicielskie w tym przypadku, musimy zmienić ** 2 ** na ** 3 ** – Ismail
@ ramka: 'stos [2] 'jest zawsze funkcją, która nazwała rejestrator, bez względu na to, jak głęboki jest stos. – georg
Po trochę badań tutaj jest dobrym rozwiązaniem:
function getFnName(fn) {
var f = typeof fn == 'function';
var s = f && ((fn.name && ['', fn.name]) || fn.toString().match(/function ([^\(]+)/));
return (!f && 'not a function') || (s && s[1] || 'anonymous');
}
function test(){
console.log(getFnName(this));
}
test = test.bind(test);
test(); // 'test'
Ale to nie działa z poziomu funkcji, chyba że masz już odwołanie do funkcji. OP poprosił o zastąpienie 'arguments.callee.name' ... – nnnnnn
Można powiązać funkcję kontekstu następnie można uzyskać dostęp do jego nazwę poprzez this.name
nieruchomości:
function x(){
console.log(this.name);
}
x.bind(x)();
Jeśli jesteś w stanie zmodyfikować ciało funkcja, aby dodać kod logowania, nie możesz po prostu zakodować nazwy funkcji? Jaką korzyść miałbyś, gdybyś mógł ją przeczytać z nieruchomości? – nnnnnn
@nnnnnn Ktoś ciągle zmienia nazwy, ale zapomina zaktualizować wiersz dziennika. – exebook