在判断函数类型时,我们通常使用typeof方法,一般情况下,它会得到我们所预想的效果。但是,有一些细节并不为我们所熟知。John
Resig
在分析了这些细节之后,为我们提供了一个完美的解决方案,本文将作详细介绍:
一、传统方法不为人所知的细节
毫无疑问,在判断函数类型时,我们使用的是typeof方法,比如:
- function fn(){
- //content
- }
- alert(typeof fn)//结果是"function"。
但是,该方法在一些浏览器中并不是像我们想像的那样工作。
1、Firefox2和Firefox3
在这两个浏览器中,用typeof检测HTML对象元素的类型,得到是一个不精确的“function”结果,而不是“object”,如HTMLDocument。如:
- alert(typeof HTMLDocument);
- //在Firefox2中结果是"function";
- //在Firefox3中结果是"object";
复制代码
2、Firefox2
对于正则表达式,在该浏览器中返回的结果是“function”(在Firefox3中结果是“object”),如:
- var reg = /test/;
- alert(typeof reg);
- //在Firefox2中结果是"function";
- //在Firefox3中结果是"object";
注:本人在safari中测试,其结果也是“function”。
3、IE6和IE7
在IE中对DOM元素使用typeof方法,得到的结果是“object”。如:
- alert(typeof document.getElementsByTagName("body")[0].getAttribute);
- //结果是"object"
复制代码
4、Safari
3
safari认为DOM元素的NodeList是一个函数,如:
- alert(typeof document.body.childNodes);
- //结果是"function"
很明显,如果你要测试一个对象是否为函数,使用typeof方法并不能从真正意义上保证测试结果。那么,我们就需要一种在所有浏览器中都能保证测试结果的解决方案。我们知道function本身有apply()和call()两种方法,但这两个方法在IE中存在问题
的函数中并不存在,试试下面的测试:
alert(typeof document.getElementsByTagName("body")[0].getAttribute.call)
//在IE中结果是"undefined"
显然,我们不能利用这两个方法。
二、完美解决方案及实现过程
John
Resig为我们提供了一个完美的解决方案,这个复杂但很稳定的判断一个对象是否为函数的方法如下:
- function isFunction( fn ) {
- return !!fn && !fn.nodeName && fn.constructor != String
&&
- fn.constructor != RegExp && fn.constructor != Array &&
- /function/i.test( fn + "" );
- }
这个函数首先保证测试的对象存在,并将其序列化成含有“function”的字符串,这个是我们检测的基础(fn.constructor
!= String,fn.constructor != Array, and fn.constructor !=
RegExp)。另外,我们需要保证声明的函数不是一个DOM节点(fn.nodeName)。然后,我们就可以作toString测试。如果我们将一个函数转换成字符串,在一个浏览器中(fn+"")给我们的结果就像这样“function
name(){...}”。现在,判断它是否为函数就很简单,仅仅只需要判断字符串中是否包含单词“function”。这很神奇,对于任何有问题的函数,在所有浏览器中都能得到我们所需要的结果。这个函数较之于传统的方法,运行速度有些不尽人意,作者建议我们保守使用。
John Resig
是jQuery库的开发者,相信使用该库的朋友们对该库简洁的语法和优秀的性能并不陌生。作者除追求代码简洁和性能高效之外,其尽善尽美的精神也让人叹服。如果你是一个完美主义者,相信此文对你很有帮助。 |
相关推荐
javascript常用判断函数大全 javascript常用判断函数 javascript常用判断函数
John Resig 在分析了这些细节之后,为我们提供了一个完美的解决方案,本文将作详细介绍: 一、传统方法不为人所知的细节 毫无疑问,在判断函数类型时,我们使用的是typeof方法,比如: 代码如下:function fn(){ //...
javascript函数式编程 javascript函数式编程 javascript函数式编程
js常用判断 搜集网络上零碎的js代码 比较全的javascript代码
java javascript javascript函数java javascript javascript函数java javascript javascript函数java javascript javascript函数java javascript javascript函数
JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)...
C#与JAVASCRIPT函数的相互调用 C#调用JAVASCRIPT函数的调用 JAVASCRIPT调用C#函数的调用
javascript函数速查javascript函数速查javascript函数速查javascript函数速查
JavaScript函数式编程.pdf 个人收集电子书,仅用学习使用,不可用于商业用途,如有版权问题,请联系删除!
JavaScript函数式编程
javascript高效编程和函数式编程指南书籍PDF,适合深入学习javascript
完成JavaScript 30天挑战的解决方案
javascript函数速查手册.rar
几个常用javascript函数,可做参考!!1
JavaScript函数大全word精华版,推荐。。。
我收集的javascript问题解决方案,包括 JavaScript 对象与数组参考大全;JavaScript 函数;Javascript 事件;javascript的高级应用;javascript里的document_all用法收集; javascript如何判断一个控件获得焦点; ...
第7节 JavaScript函数及应用.rar第7节 JavaScript函数及应用.rar第7节 JavaScript函数及应用.rar第7节 JavaScript函数及应用.rar第7节 JavaScript函数及应用.rar第7节 JavaScript函数及应用.rar第7节 JavaScript函数...