Javascript 判断函数类型完美解决方案


Posted in Javascript onSeptember 02, 2009

但是,有一些细节并不为我们所熟知。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 异步调用框架 (Part 5 - 链式实现)
Aug 04 Javascript
jMessageBox 基于jQuery的窗口插件
Dec 09 Javascript
Extjs在exlipse中设置自动提示的方法
Apr 07 Javascript
js的正则test,match,exec详细解析
Jan 29 Javascript
JavaScript中用字面量创建对象介绍
Dec 31 Javascript
JavaScript使用DeviceOne开发实战(三)仿微信应用
Dec 02 Javascript
详解Angularjs filter过滤器
Feb 06 Javascript
js实现类bootstrap模态框动画
Feb 07 Javascript
JS组件系列之Gojs组件 前端图形化插件之利器
Nov 29 Javascript
详解Vue结合后台的列表增删改案例
Aug 21 Javascript
详解如何配置vue-cli3.0的vue.config.js
Aug 23 Javascript
纯 JS 实现放大缩小拖拽功能(完整代码)
Nov 25 Javascript
javascript 控制 html元素 显示/隐藏实现代码
Sep 01 #Javascript
jsTree树控件(基于jQuery, 超强悍)[推荐]
Sep 01 #Javascript
JavaScript 继承详解 第一篇
Aug 30 #Javascript
JavaScript 应用技巧集合[推荐]
Aug 30 #Javascript
用cssText批量修改样式
Aug 29 #Javascript
javascript appendChild,innerHTML,join性能比较代码
Aug 29 #Javascript
IE 条件注释详解总结(附实例代码)
Aug 29 #Javascript
You might like
PHP策略模式定义与用法示例
2017/07/27 PHP
浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
2019/10/21 PHP
使用javascript实现ListBox左右全选,单选,多选,全请
2013/11/07 Javascript
JavaScript制作的可折叠弹出式菜单示例
2014/04/04 Javascript
Node调试工具JSHint的安装及配置教程
2014/05/27 Javascript
JavaScript获取当前cpu使用率的方法
2015/12/15 Javascript
js判断移动端是否安装某款app的多种方法
2015/12/18 Javascript
BootStrap 智能表单实战系列(十)自动完成组件的支持
2016/06/13 Javascript
全面解析JS字符串和正则表达式中的match、replace、exec等函数
2016/07/01 Javascript
jQuery用户头像裁剪插件cropbox.js使用详解
2017/06/07 jQuery
jQuery+HTML5实现WebGL高性能烟花绽放动画效果【附demo源码下载】
2017/08/18 jQuery
webpack配置导致字体图标无法显示的解决方法
2018/03/06 Javascript
javascript实现京东快递单号的查询效果
2020/11/30 Javascript
[02:40]2014DOTA2 国际邀请赛中国区预选赛 四大豪门抵达华西村
2014/05/23 DOTA
用Python编写分析Python程序性能的工具的教程
2015/04/01 Python
Python3通过Luhn算法快速验证信用卡卡号的方法
2015/05/14 Python
Python中基本的日期时间处理的学习教程
2015/10/16 Python
Python使用pygame模块编写俄罗斯方块游戏的代码实例
2015/12/08 Python
python如何去除字符串中不想要的字符
2020/07/05 Python
如何实现一个python函数装饰器(Decorator)
2020/10/12 Python
使用Python提取文本中含有特定字符串的方法示例
2020/12/09 Python
css3.0 图形构成实例练习二
2013/03/19 HTML / CSS
详解移动端Html5页面中1px边框的几种解决方法
2018/07/24 HTML / CSS
加拿大领先的时尚和体育零售商:Sporting Life
2019/12/15 全球购物
法国春天百货官网:Printemps.com
2020/06/29 全球购物
会计专业毕业生推荐信
2013/11/05 职场文书
演讲主持词
2014/03/18 职场文书
小学五一劳动节活动总结
2015/02/09 职场文书
幼儿园教师师德表现自我评价
2015/03/05 职场文书
2015年度培训工作总结范文
2015/04/02 职场文书
乡镇科协工作总结2015
2015/05/19 职场文书
初中军训感想
2015/08/07 职场文书
导游词之南迦巴瓦峰
2019/11/19 职场文书
微信小程序实现录音Record功能
2021/05/09 Javascript
浅谈JS的原型和原型链
2021/06/04 Javascript
Java用自带的Image IO给图片添加水印
2021/06/15 Java/Android