문제

나는 이것에 대해 약간의 연구를 수행했지만 사용 된 방법은 일관성이없고 다양합니다.

과거에 사용한 몇 가지 방법은 다음과 같습니다.

/* 1: */  typeof myFunc === 'function'
/* 2: */  myFunc.constructor === Function
/* 3: */  myFunc instanceof Function

내 연구의 일환으로 나는 잘 알려진 라이브러리가 어떻게이를 달성했는지 살펴 보았습니다.

 /* jQuery 1.2.6: */  !!fn && typeof fn != "string" && !fn.nodeName && fn.constructor != Array && /^[\s[]?function/.test( fn + "" )
 /* jQuery 1.3b1: */  toString.call(obj) === "[object Function]"
/* Prototype 1.6: */  typeof object == "function"
      /* YUI 2.6: */  typeof o === 'function'

나는 존재가 너무 많이 사용되는 많은 방법이 있다는 것에 놀랐습니다. 반드시 수용 가능한 단일 테스트가 합의되었습니다. 그리고 나는 jQuery 1.2.6의 표현에 대한 의도가 무엇인지에 대해 완전히 단서가 없다.

그래서 내 quesiton이 남아 있습니다. 기능을 테스트하는 가장 좋은 방법은 무엇입니까?

또한 위의 방법 중 일부, 특히 jQuery 1.2.6에 대한 통찰력에 감사드립니다. (나는 그들이 무엇을하고 있는지 볼 수 있습니다. 그것은 단지 이상해 보입니다)

*] 'Best'에 의해, 나는 가장 널리 받아 들여진 크로스 브라우저 호환 방법을 의미합니다.


편집 : 예, 이전에 논의 된 것을 알고 있지만 여전히 가장 효과적인 방법에 대한 논의를 원합니다. 왜 그렇게 많이 사용 된 방법이 있습니까?

지금까지 논의는 연산자의 유형에 대해서만 언급했지만 (대부분) 아무도 대체 방법의 효과에 대해 아무도 암시하지 않았습니다.

도움이 되었습니까?

해결책

객체가 함수인지 테스트하는 가장 좋은 방법은 typeof myFunc === 'function'. 라이브러리를 사용하는 경우 해당 라이브러리의 기능 테스트를 사용하십시오. jQuery.isFunction(myFunc).

것들 ~할 수 있다 사용시 함수로 잘못보고됩니다 typeof. 이것은 매우 드물지만 라이브러리는 이러한 불일치를 제거하기 위해 있습니다. 이러한 문제를 해결하는 jQuery :

  • Firefox 보고서 기능 typeof document.createElement("object")
  • 사파리는 기능을보고합니다 typeof document.body.childNodes
  • 구형 버전의 Firefox는 정규 표현을 기능으로보고했습니다 (3.0의 경우는 아닙니다).
  • 일부 IE는 글로벌 기능으로 내장되었습니다 (alert) 및 일부 노드 방법 (getAttribute)는 유형 "객체"인 것으로보고됩니다.

사용 instanceof 보다는 typeof 이것들 중 일부를 우회합니다. 예를 들어, document.createElement("object") instanceof Function ~이다 false Firefox에서.

주석에서 첫 번째 방법의 탄생을 볼 수 있습니다. 원래 티켓 (#3618). 새로운 방법은 변경 사항 5947 해결하기 위해 Resig에 의해 발명 된 것 같습니다. 즉, 메모리 누출. 아마도 느리지 만 작고 깨끗할 것입니다.

일이 어떻게 작동하는지에있어 ==와 === 사이에는 큰 차이가 없지만 엄격한 평가는 약간 더 빠르기 때문에 선호됩니다.

다른 팁

John Resig는 jQuery의 개발자가 jQuery의 내부에서 기괴한 선택을 한 것 같습니다.

toString.call(obj) === "[object Function]"

매우 깔끔하게 보이지만 위의 사실이 단순한 곳에서는 어떤 상황도 생각할 수 없습니다. typeof 접근은 실패했지만 아마도 그는 나머지 사용이없는 것을 알고있을 것입니다.

typeof o === "function"

효과가 없다는 강력한 증거가 없다면 더 명확 해지 기 때문에 후자와 함께 갈 것입니다.

엄격한 평등을 사용하는 이유 typeof 두 피연산자 모두 줄이기 때문에? 나는 몇 가지 문제를 간과하고 있습니까?

어쨌든, 나는 더 간단한 Typeof 방식으로 갈 것입니다. instanceof 도 읽을 수는 있지만 함수가 객체라는 사실에 대해 더 많이 주장하는 것 같습니다. 이는 문제와 관련이 없을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top