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つの(非常にugい)ソリューションを示します。
'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
これはChrome、Firefox、IE11でのみテストしたため、走行距離は異なる場合があります。
これは生産的な目的には使用しないでください。これは。い解決策であり、デバッグには役立ちますが、呼び出し元から何かが必要な場合は、引数として渡すか、アクセス可能な変数に保存してください。
@ p.s.w.g answerの短いバージョン(エラーをスローすることなく、ただインスタンス化する):
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
うまくいかない
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);
}
次を使用してスタックトレースを取得できます。
console.trace()
ただし、発信者と何かをする必要がある場合、これは役に立たない可能性があります。
https://developer.mozilla.org/en-US/docs/Web/API/Console/trace を参照してください