Jak dowiedzieć się, że funkcja wywołująca w JavaScript jest włączona przy użyciu strict?

Czy jest możliwe wyświetlenie callee / caller funkcji, gdy use strict jest włączona?

'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 ();
Author: Jamie Hutber, 2015-04-11

5 answers

Jeśli to coś warte, zgadzam się z powyższymi komentarzami. Niezależnie od problemu, który próbujesz rozwiązać, zazwyczaj są lepsze rozwiązania.

Jednak tylko dla celów ilustracyjnych, oto jedno (bardzo brzydkie ) Rozwiązanie:

'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

Testowałem to tylko w Chrome, Firefox i IE11, więc przebieg może się różnić.

 46
Author: p.s.w.g,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-25 13:58:18

Należy pamiętać, że nie powinno to być wykorzystywane w produkcji. Jest to brzydkie rozwiązanie, które może być pomocne przy debugowaniu, ale jeśli potrzebujesz czegoś od wywołującego, podaj to jako argument lub zapisz do dostępnej zmiennej.

Krótka wersja odpowiedzi @p. s. W. g (bez rzucania błędu, tylko tworzenie instancji):

    let re = /([^(]+)@|at ([^(]+) \(/g;
    let aRegexResult = re.exec(new Error().stack);
    sCallerName = aRegexResult[1] || aRegexResult[2];

Pełny Fragment:

'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
 29
Author: inetphantom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-06 07:41:07

To nie działa na mnie Oto, co w końcu robię, na wypadek, gdyby to komuś pomogło

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);
}
 11
Author: Benamar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-05 10:12:13

Możesz uzyskać ślad stosu używając:

console.trace()

Ale to prawdopodobnie nie jest przydatne, jeśli musisz coś zrobić z rozmówcą.

Zobacz https://developer.mozilla.org/en-US/docs/Web/API/Console/trace

 6
Author: Larry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-13 13:24:57
  functionName() {
    return new Error().stack.match(/ at (\S+)/g)[1].get(/ at (.+)/);
  }

  // Get - extract regex
  String.prototype.get = function(pattern, defaultValue = "") {
    if(pattern.test(this)) {
      var match = this.match(pattern);
      return match[1] || match[0];
    }
    return defaultValue; // if nothing is found, the answer is known, so it's not null
  }
 0
Author: toddmo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-19 23:18:12