web-dev-qa-db-ja.com

use strictが有効になっている場合、JavaScriptで呼び出し元関数をどのように見つけますか?

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 ();
40
Jamie Hutber

その価値については、上記のコメントに同意します。あなたが解決しようとしているどんな問題に対しても、通常、より良い解決策があります。

ただし、説明のためだけに、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でのみテストしたため、走行距離は異なる場合があります。

40
p.s.w.g

これは生産的な目的には使用しないでください。これは。い解決策であり、デバッグには役立ちますが、呼び出し元から何かが必要な場合は、引数として渡すか、アクセス可能な変数に保存してください。

@ 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
27
inetphantom

うまくいかない

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);
}
6
Benamar

次を使用してスタックトレースを取得できます。

console.trace()

ただし、発信者と何かをする必要がある場合、これは役に立たない可能性があります。

https://developer.mozilla.org/en-US/docs/Web/API/Console/trace を参照してください

5
Larry