2016-07-18 21 views
13

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.

+2

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

+4

@nnnnnn Ktoś ciągle zmienia nazwy, ale zapomina zaktualizować wiersz dziennika. – exebook

Odpowiedz

18

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'); 
 
});

+0

Twoja odpowiedź jest nieco skomplikowana, ale pokazuje pomysł. – exebook

+0

Ś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

+3

@ ramka: 'stos [2] 'jest zawsze funkcją, która nazwała rejestrator, bez względu na to, jak głęboki jest stos. – georg

0

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' 

Źródło: https://gist.github.com/dfkaye/6384439

+2

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

1

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)(); 
Powiązane problemy