Как узнать функцию звонящего в JavaScript, когда включена функция strict?
Возможно ли увидеть вызывающую/вызывающую функцию, если use strict
включена?
'use strict';
function jamie (){
console.info(arguments.callee.caller.name);
//this will output the below error
//uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
};
function jiminyCricket (){
jamie();
}
jiminyCricket ();
Ответы
Ответ 1
Для чего это стоит, я согласен с комментариями выше. По любой проблеме, которую вы пытаетесь решить, обычно есть лучшие решения.
Однако, только для иллюстративных целей, здесь одно (очень уродливое) решение:
'use strict'
function jamie (){
var callerName;
try { throw new Error(); }
catch (e) {
var re = /(\w+)@|at (\w+) \(/g, st = e.stack, m;
re.exec(st), m = re.exec(st);
callerName = m[1] || m[2];
}
console.log(callerName);
};
function jiminyCricket (){
jamie();
}
jiminyCricket(); // jiminyCricket
Ответ 2
Обратите внимание, что это не должно использоваться в производственных целях. Это уродливое решение, которое может быть полезно для отладки, но если вам нужно что-то от вызывающего, передайте его в качестве аргумента или сохраните в доступной переменной.
Короткий вариант ответа @p.s.w.g(не вызывая ошибки, просто создавая экземпляр):
let re = /([^(]+)@|at ([^(]+) \(/g;
let aRegexResult = re.exec(new Error().stack);
sCallerName = aRegexResult[1] || aRegexResult[2];
Полный фрагмент:
'use strict'
function jamie (){
var sCallerName;
{
let re = /([^(]+)@|at ([^(]+) \(/g;
let aRegexResult = re.exec(new Error().stack);
sCallerName = aRegexResult[1] || aRegexResult[2];
}
console.log(sCallerName);
};
function jiminyCricket(){
jamie();
};
jiminyCricket(); // jiminyCricket
Ответ 3
Это не сработало для меня
Вот что я наконец делаю, на всякий случай это помогает кому-то
function callerName() {
try {
throw new Error();
}
catch (e) {
try {
return e.stack.split('at ')[3].split(' ')[0];
} catch (e) {
return '';
}
}
}
function currentFunction(){
let whoCallMe = callerName();
console.log(whoCallMe);
}