Как узнать функцию звонящего в 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);
}