함수 유형을 판단할 때 일반적으로 typeof 메서드를 사용하면 예상한 효과를 얻을 수 있습니다. 그러나 우리에게 잘 알려지지 않은 몇 가지 세부 사항이 있습니다. 이러한 세부 사항을 분석한 후 John Resig는 완벽한 솔루션을 제공했으며 이 기사에서 자세히 소개됩니다.
1. 전통적인 방법의 알려지지 않은 세부 사항
함수 유형을 결정할 때 다음과 같은 typeof 메소드를 사용한다는 것은 의심의 여지가 없습니다.
함수 fn(){
//콘텐츠
}
Alert(typeof fn)//결과는 "function"입니다.
그러나 이 방법은 일부 브라우저에서는 예상대로 작동하지 않습니다.
1. 파이어폭스2와 파이어폭스3
이 두 브라우저에서 HTML 객체 요소의 유형을 감지하기 위해 typeof를 사용하면 HTMLDocument와 같은 "객체" 대신 부정확한 "함수" 결과가 발생합니다. 좋다:
경고(HTML문서 유형);
//Firefox2에서는 결과가 "function"입니다.
//Firefox3에서는 결과가 "object"입니다.
2. 파이어폭스2
정규 표현식의 경우 이 브라우저에 반환되는 결과는 다음과 같이 "function"입니다(Firefox3에서는 결과가 "object"입니다).
var reg = /테스트/;
경고(reg 유형);
//Firefox2에서는 결과가 "function"입니다.
//Firefox3에서는 결과가 "object"입니다.
참고: Safari에서 테스트했는데 결과도 "기능"이었습니다.
3. IE6과 IE7
IE의 DOM 요소에 typeof 메소드를 사용하면 결과는 "객체"입니다. 좋다:
Alert(typeof document.getElementsByTagName("body")[0].getAttribute);
//결과는 "객체"입니다.
4. 사파리 3
Safari는 DOM 요소의 NodeList가 다음과 같은 함수라고 생각합니다.
경고(문서 유형.body.childNodes);
//결과는 "함수"입니다.
분명히, 객체가 함수인지 테스트하려는 경우 typeof 메서드를 사용한다고 해서 실제 의미에서 테스트 결과가 보장되는 것은 아닙니다. 그런 다음 모든 브라우저에서 테스트 결과를 보장하는 솔루션이 필요합니다. 함수 자체에는 apply()와 call()이라는 두 가지 메서드가 있다는 것을 알고 있지만 IE의 문제가 있는 함수에는 이 두 메서드가 존재하지 않습니다. 다음 테스트를 시도해 보세요.
경고(문서 유형.getElementsByTagName("body")[0].getAttribute.call)
//IE에서는 결과가 "정의되지 않음"입니다.
분명히 우리는 이 두 가지 방법을 활용할 수 없습니다.
2. 완벽한 솔루션 및 구현 프로세스
John Resig는 객체가 함수인지 여부를 결정하는 복잡하지만 안정적인 방법을 우리에게 제공했습니다.
함수 isFunction( fn ) {
return !!fn && !fn.nodeName && fn.constructor != 문자열 &&
fn.constructor != RegExp && fn.constructor != 배열 &&
/function/i.test(fn + "" );
}
이 함수는 먼저 테스트 개체가 존재하는지 확인하고 이를 "함수"를 포함하는 문자열로 직렬화합니다. 이것이 탐지의 기초입니다(fn.constructor != String, fn.constructor != Array 및 fn.constructor != RegExp). . 또한 선언된 함수가 DOM 노드(fn.nodeName)가 아닌지 확인해야 합니다. 그런 다음 toString 테스트를 수행할 수 있습니다. 함수를 문자열로 변환하면 브라우저(fn+"")에서 "함수 이름(){...}"과 같은 결과가 나타납니다. 이제 그것이 함수인지 여부를 결정하는 것은 문자열에 "function"이라는 단어가 포함되어 있는지 확인하는 것만 큼 간단합니다. 이는 놀라운 일입니다. 문제의 모든 기능에 대해 모든 브라우저에서 필요한 결과를 얻을 수 있습니다. 기존 방식에 비해 이 기능의 실행 속도는 다소 만족스럽지 못하므로 저자는 보수적으로 사용할 것을 권장합니다.
John Resig 는 jQuery 라이브러리의 개발자입니다. 이 라이브러리를 사용하는 친구들은 간결한 구문과 뛰어난 성능에 익숙할 것입니다. 코드의 단순성과 고성능을 추구하는 것은 물론, 저자의 완벽함을 추구하는 정신도 인상적이다. 당신이 완벽주의자라면, 이 글이 당신에게 도움이 될 것이라고 믿습니다.