2016-07-18 2 views
13

Мне нужно имя текущей функции в виде строки для входа в наш журнал. Но arguments.callee.name работает только в свободном режиме. Как получить имя функции под "use strict"?Получить текущее имя функции в строгом режиме

+2

Если вы в состоянии изменить тело функции, чтобы добавить код протоколирования, не можете ли вы просто скопировать имя функции? Какое преимущество у вас было бы, если бы вы могли прочитать его из собственности? – nnnnnn

+4

@nnnnnn кто-то сохраняет функции переименования, но забывает обновлять строку журнала. – exebook

ответ

18

Для целей регистрации/отладки, вы можете создать новый объект Error в регистраторе и проверить его свойство .stack, например,

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

. Ваш ответ немного сложный, но он показывает идею. – exebook

+0

Отличный ответ @georg. Обратите внимание, что '' [2] '' относится только к этому примеру, если у вас есть, например, стек, содержащий три родительские функции, в этом случае мы должны изменить ** 2 ** на ** 3 ** – Ismail

+3

@ amism: 'stack [2] 'всегда является функцией, называемой регистратором, независимо от глубины стека. – georg

0

После небольшого исследования здесь является хорошим решением:

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' 

Источник: https://gist.github.com/dfkaye/6384439

+2

Но это не работает из функции, если у вас уже нет ссылки на функцию. OP попросил заменить «arguments.callee.name' ... – nnnnnn

1

Вы можете связать функцию контекста, то вы можете получить доступ к его имени через this.name собственности:

function x(){ 
    console.log(this.name); 
} 
x.bind(x)(); 
Смежные вопросы