2011-01-09 4 views
3

f을 가리키는 메소드의 이름을 검색하려면 종종 f 함수가 필요합니다. 예를 들어.strict 모드 JavaScript에서 "self"함수 검색

obj = { 
    foo : function() { 
     var myName = getMethodName(obj, arguments.callee); // "foo" 
    } 
} 

내가 엄격 모드에서이 작업을 수행하려면 어떻게 arguments.callee가되지 않습니다 :의 우리가 methodFunction에 대한 링크는 속성을 찾을 objforeach를 사용하는 getMethodName(obj, methodFunction) 기능을 가지고 있다고 가정 해 봅시다?

답변

4

할 수 없습니다. 그리고 처음부터 그렇게해서는 안됩니다. 이것은 마법이며, 함수는 호출자 등에 의존해서는 안됩니다. 다시 작동하게하려면 디자인을 변경하십시오.

arguments.callee.caller은 스타일이 좋지 않아서 제거되었을뿐만 아니라 최적화가 실패했기 때문에 제거되었습니다. 즉, 인라이닝 (inline)은 호출자 나 함수에 의존한다면 무언가를 인라인 할 수 없다.

읽기 : http://whereswalden.com/2010/09/08/new-es5-strict-mode-support-now-with-poison-pills/

+0

문서가 "tl; dr"으로 시작하는 이유는 무엇입니까? 나는 그것이 일반적으로 의미하는 바를 알고 있지만,이 맥락에서는 아닙니다. –

+0

@Sime 글쎄, 작가는 그의 기사가 기본적으로 하나의 거대한 텍스트 벽이라는 사실에 대해 농담을 한 것 같습니다. –

+0

아하 농담. 아마 그럴거야. –

1

당신이 그것을 생각하면 난 당신이 단순히 객체의 기능에 문자의 이름을 제공하면 그것을 그런 식으로 참조 할 수 말할 수 없기 때문에 그것은, 지적 가치 :

obj = { 
    foo : function METHODNAME() { 
     var myName = getMethodName(obj, METHODNAME); // "foo" 
    } 
} 

하지만 조심 : 나는 IE는이 둘러싸 범위에 METHODNAME라는 함수를 정의합니다 릴리스 버전에서 버그가 있다고 생각 (보다는 그 함수에 액세스 할 수 있도록 만 해당). 그러나 spec에 따라 함수 자체에서 찾을 수없는 이름을 사용하거나 함수가 eval이라고 할 수있는 경우 eval으로 전달 된 코드를 사용하는 한 완벽하게 정교하고 완벽하게 작동합니다.

+0

하지만 할 일이 있다고 가정하십시오. addEventListener ("event", myfun.bind (this)); 어딘가에 저장하지 않고이 수신기를 제거 할 수는 없습니까? myfun.bind()는 새로운 함수를 반환하기 때문입니다. 그건 정말 절름발이 야. –

+0

맞아. "슈퍼 라임 (super-lame)"은 보는 사람의 눈에 띄는 부분이지만, 언어와 API가 작동하는 방식입니다. 그리고 다른 방법은 무엇일까요? 주어진 GC 동작 (약한 참조와 비슷한 동작이 나옴)을 드러내지 않으려는 경우, 이전에 추가 한 리스너를 제거하여 여러 리스너간에 모호한 방법이 필요합니다. 자연스러운 방법을 제거하기 위해 참조를 지정하여 제거하지 않습니까? 어쩌면 약간 어색 할 지 모르지만 나는 더 좋은 방법을 보지 못하고있다. –

+0

글쎄요, arguments.callee를 사용할 수있을 때 훌륭하게 작동했습니다. 논쟁은 당신이 그것 없이는 아무것도 잃지 않는다는 것입니다. 단지 함수의 이름을 짓는 것입니다. 실제로 함수의 이름을 지정할 수는 없기 때문에 실제로 무언가를 잃어버린다고 말하고 있습니다. 이제 엄격 모드를 사용하지 않도록 설정하고 모든 이벤트 리스너를 수동으로 추적하는 성가심 (및 누출 가능성)을 발생시켜야합니다. –

관련 문제