ES6 (아래 센디 할림의 답변에서 영감을 얻음) :
myFunction.name
MDN에 대한 설명 . 2015 년 현재 nodejs 및 IE를 제외한 모든 주요 브라우저에서 작동합니다.
참고 : 바인딩 된 함수에서는 " bound <originalName>
"가 표시됩니다. 원래 이름을 얻으려면 "바운드"를 제거해야합니다.
ES5 (Vlad의 답변에서 영감을 받음) :
함수에 대한 참조가있는 경우 다음을 수행 할 수 있습니다.
function functionName( func )
{
// Match:
// - ^ the beginning of the string
// - function the word 'function'
// - \s+ at least some white space
// - ([\w\$]+) capture one or more valid JavaScript identifier characters
// - \s* optionally followed by white space (in theory there won't be any here,
// so if performance is an issue this can be omitted[1]
// - \( followed by an opening brace
//
var result = /^function\s+([\w\$]+)\s*\(/.exec( func.toString() )
return result ? result[ 1 ] : '' // for an anonymous function there won't be a match
}
- 나는 이것에 대해 단위 테스트를 실행하지 않았거나 구현 차이를 확인했지만 원칙적으로 주석을 남기지 않으면 작동해야합니다.
- 참고 : 바운드 함수에서는 작동하지 않습니다
- 참고 : 그
caller
와 callee
사용되지 않는 것으로 간주한다.
[1] 합법적이고 종종 구문 강조 도구가 함수 이름과 괄호 사이의 공백을 고려하지 못하기 때문에 여기에 포함 시켰습니다. 반면에 여기에 공백이 포함될 .toString () 구현을 알지 못하므로 생략 할 수 있습니다.
원래 질문에 대한 답으로 기생 적 상속을 중단하고 좀 더 전통적인 OOP 디자인 패턴을 사용합니다. C ++을 모방 한 기능 세트 (아직 완전하지는 않지만 대부분)를 사용하여 JavaScript에서 OOP 코드를 편안하게 작성하기 위해 TidBits.OoJs 를 작성했습니다 .
의견에서 정보 parent
요구 사항을 생성자에게 전달하지 않기를 바랍니다 . 나는 전통적인 디자인 패턴이 당신의 의존성을 분명하고 강제하는 것이 일반적으로 좋은 것으로 간주되기 때문에 그 패턴에서 당신을 구할 수 없다는 것을 인정해야합니다.
또한 익명의 기능을 피하는 것이 좋습니다. 모든 것이 단지 "익명 함수"로 나타나기 때문에 PITA의 디버깅 및 프로파일 링 만 수행하며, 내가 알고있는 이점은 없습니다.