在判断函数类型时,我们通常使用typeof方法,一般情况下,它会得到我们所预想的效果。但是,有一些细节并不为我们所熟知。John Resig 在分析了这些细节之后,为我们提供了一个完美的解决方案,本文将作详细介绍: 一、传统方法不为人所知的细节 毫无疑问,在判断函数类型时,我们使用的是typeof方法,比如:
但是,该方法在一些浏览器中并不是像我们想像的那样工作。 1、Firefox2和Firefox3 在这两个浏览器中,用typeof检测HTML对象元素的类型,得到是一个不精确的“function”结果,而不是“object”,如HTMLDocument。如:
复制代码 2、Firefox2 对于正则表达式,在该浏览器中返回的结果是“function”(在Firefox3中结果是“object”),如:
注:本人在safari中测试,其结果也是“function”。 3、IE6和IE7 在IE中对DOM元素使用typeof方法,得到的结果是“object”。如:
复制代码 4、Safari 3 safari认为DOM元素的NodeList是一个函数,如:
很明显,如果你要测试一个对象是否为函数,使用typeof方法并不能从真正意义上保证测试结果。那么,我们就需要一种在所有浏览器中都能保证测试结果的解决方案。我们知道function本身有apply()和call()两种方法,但这两个方法在IE中存在问题 的函数中并不存在,试试下面的测试:
显然,我们不能利用这两个方法。 二、完美解决方案及实现过程 John Resig为我们提供了一个完美的解决方案,这个复杂但很稳定的判断一个对象是否为函数的方法如下:
这个函数首先保证测试的对象存在,并将其序列化成含有“function”的字符串,这个是我们检测的基础(fn.constructor != String,fn.constructor != Array, and fn.constructor != RegExp)。另外,我们需要保证声明的函数不是一个DOM节点(fn.nodeName)。然后,我们就可以作toString测试。如果我们将一个函数转换成字符串,在一个浏览器中(fn+"")给我们的结果就像这样“function name(){...}”。现在,判断它是否为函数就很简单,仅仅只需要判断字符串中是否包含单词“function”。这很神奇,对于任何有问题的函数,在所有浏览器中都能得到我们所需要的结果。这个函数较之于传统的方法,运行速度有些不尽人意,作者建议我们保守使用。 John Resig 是jQuery库的开发者,相信使用该库的朋友们对该库简洁的语法和优秀的性能并不陌生。作者除追求代码简洁和性能高效之外,其尽善尽美的精神也让人叹服。如果你是一个完美主义者,相信此文对你很有帮助。 |
iOS 调用js方法 判断是否存在js方法 js判断函数的方法
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
ios 判断方法是否存在 js判断iphonex
js--判断当前环境是否为iphonex环境
ios 判断方法是否存在 iphone Mac -
javascript 判断控件是否存在 js判断是否存在方法
方法1:利用for循环 实现思想:利用for语句来遍历数组,在每次循环中利用===判断数组元素是否为给定值,当有第一个元素满足条件,则数组中存在给定元素,给出提示,然后使用break语句退出整个循环。 下面通过实例来具体了解一下:判断fruits数组中是否包含给定元素“榴
javascript 判断控件是否存在 javascript 数组 搜索 for循环 -
java注解里面不能调用静态函数
前言 java反射和注解在java里面很重要,但是很多人对这方面的知识理解不是很好,我来说说我自己对java反射和注解的理解,这两块内容本来应该出在一个博客文章里面讲解,但是由于我的java反射说的内容有点小多,然后我就分开将讲解一下。目录注解的概念注解的类别注解用法通过反射获取注解反射注解一起使用拼写SQL语句实战演练注解的概念java注解:比较官方的说法:从
java注解里面不能调用静态函数 java case用法 java resume过时方法 java 实体类 临时注解 java 注解 -
李宏毅 机器学习2023
【李宏毅】元学习(Meta learning)的概念与步骤1 概念2 元学习步骤2.1 定义一组学习算法2.2 评价一个学习算法 F F
李宏毅 机器学习2023 学习 机器学习 人工智能 小样本学习