[javascript] JavaScript에서 현재 실행중인 함수의 이름을 얻을 수 있습니까?

이것을 할 수 있습니까?

myfile.js:
function foo() {
    alert(<my-function-name>);
    // pops-up "foo"
    // or even better: "myfile.js : foo"
}

내 스택에 Dojo 및 jQuery 프레임 워크가 있으므로 둘 중 하나가 더 쉬워지면 사용할 수 있습니다.



답변

ES5 이상에서는 해당 정보에 액세스 할 수 없습니다.

이전 버전의 JS에서는을 사용하여 얻을 수 있습니다 arguments.callee.

추가 정크가 포함되어 있으므로 이름을 구문 분석해야 할 수도 있습니다. 그러나 일부 구현에서는 단순히 다음을 사용하여 이름을 얻을 수 있습니다.arguments.callee.name .

파싱 ​​:

function DisplayMyName()
{
   var myName = arguments.callee.toString();
   myName = myName.substr('function '.length);
   myName = myName.substr(0, myName.indexOf('('));

   alert(myName);
}

출처 : Javascript-현재 함수 이름을 가져옵니다 .


답변

비 익명 함수

function foo()
{
    alert(arguments.callee.name)
}

그러나 오류 처리기의 경우 결과는 오류 처리기 함수의 이름이됩니까?


답변

필요한 것은 간단합니다. 함수 만들기 :

function getFuncName() {
   return getFuncName.caller.name
}

그런 다음 필요할 때마다 다음을 사용하십시오.

function foo() {
  console.log(getFuncName())
}

foo()
// Logs: "foo"


답변

MDN 에 따르면

경고 : ECMAScript (ES5) 5 판에서는 엄격 모드에서 arguments.callee ()를 사용할 수 없습니다. 함수 표현식에 이름을 지정하거나 함수 자체를 호출해야하는 함수 선언을 사용하여 arguments.callee ()를 사용하지 마십시오.

언급했듯이 이것은 스크립트가 “엄격 모드”를 사용하는 경우 에만 적용 됩니다 . 이것은 주로 보안상의 이유이며 슬프게도 현재로서는 이에 대한 대안이 없습니다.


답변

이것은해야합니다 :

var fn = arguments.callee.toString().match(/function\s+([^\s\(]+)/);
alert(fn[1]);

발신자의 경우을 사용하십시오 caller.toString().


답변

이것은 “세계에서 가장 추악한 해킹”의 범주로 가야하지만 여기 있습니다.

먼저 현재 의 이름을 인쇄 함수 것은 (다른 답변에서와 같이) 나에게 제한적 인 것처럼 보입니다. 기능이 무엇인지 이미 알고 있기 때문입니다!

그러나 호출 함수 의 이름을 찾는 것은 추적 함수에 매우 유용 할 수 있습니다. 이것은 정규 표현식을 사용하지만 indexOf를 사용하면 약 3 배 빠릅니다.

function getFunctionName() {
    var re = /function (.*?)\(/
    var s = getFunctionName.caller.toString();
    var m = re.exec( s )
    return m[1];
}

function me() {
    console.log( getFunctionName() );
}

me();


답변

작동하는 방법은 다음과 같습니다.

export function getFunctionCallerName (){
  // gets the text between whitespace for second part of stacktrace
  return (new Error()).stack.match(/at (\S+)/g)[1].slice(3);
}

그런 다음 테스트에서 :

import { expect } from 'chai';
import { getFunctionCallerName } from '../../../lib/util/functions';

describe('Testing caller name', () => {

    it('should return the name of the function', () => {
      function getThisName(){
        return getFunctionCallerName();
      }

      const functionName = getThisName();

      expect(functionName).to.equal('getThisName');
    });

  it('should work with an anonymous function', () => {


    const anonymousFn = function (){
      return getFunctionCallerName();
    };

    const functionName = anonymousFn();

    expect(functionName).to.equal('anonymousFn');
  });

  it('should work with an anonymous function', () => {
    const fnName = (function (){
      return getFunctionCallerName();
    })();

    expect(/\/util\/functions\.js/.test(fnName)).to.eql(true);
  });

});

세 번째 테스트는 테스트가 / util / functions에있는 경우에만 작동합니다.