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