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 ();
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ć.
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
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);
}
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
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
}
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