问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Javascript函数问题,怎么解决

发布网友 发布时间:2022-04-24 20:35

我来回答

2个回答

懂视网 时间:2022-04-25 00:56

但是,有一些细节并不为我们所熟知。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库的开发者,相信使用该库的朋友们对该库简洁的语法和优秀的性能并不陌生。作者除追求代码简洁和性能高效之外,其尽善尽美的精神也让人叹服。如果你是一个完美主义者,相信此文对你很有帮助。

热心网友 时间:2022-04-24 22:04

方法1、

function sumAll403(a,b,n){
var i=a;
if(i<b){
return Math.pow(i,n)+sumAll403(++i,b,n);
}else{
return Math.pow(i,n)
}
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
什么药止痒效果好 慕容三藏履历 职业cf电脑配置cf电脑配置要求是什么 玩3a电脑配置要求想玩3a大作需要什么配置 台式电脑哪些可以畅享3a大作想玩3a大作需要什么配置 七彩虹i7-10700台式机 性能强劲 高效静音 小黄鱼游戏台式电脑主机(i7-10700F、16GB、512GB、RTX3070)-适用... 工伤保险记什么科目 在4×4的正方形格纸中,有一个以格点为顶点的△ABC,请你找到点C,使三角... 在4×4方格中, 要求C点在格点上,且以AB为边的△ABC为直角三角形,标出所... 在公交车上摔了怎么办 在乘坐公交车时上车时车门把人碰伤了怎么处理? 未成年人在公交车上受伤怎么处理 手机支付宝可以转账到广东省农村信用社联合社吗 支付宝可以转账入广东农村信用社吗? 支付宝钱包可以转账到广东农村信用社的卡吗 裤子上柒上花粉色该怎样洗掉 特步粉色衣服和牛仔裤一起洗,被裤子染色了,该怎么办?怎么变回原样? 粉色裤子和蓝色裤子一起洗,粉色裤子染上蓝色了,该怎么办。 粉色裤子染色了怎么办 粉红色裤子被染橘色了应该怎么样才能洗掉洗掉? 我的粉色裤子上不小心染上了黑色,怎么办啊! 电话被拉黑了怎么办才能联系对方 判断js对象的数据类型,有没有一个最完美的方法 地球在哪 地球在哪里 跪求 什么是职业生涯规划管理的重要手段 太原汽车压缩复原技术哪里有 深海鱼是什么鱼 开宗明义章第一的介绍 乘坐公交车受伤了,我该怎么办 空间向量的坐标运算 空间坐标系向量运算 空间向量平行的坐标表示 陆贾传书是什么意思? 驿骑传书什么意思 远方传书意思 “鸿雁传书”的意思是什么? 鱼雁传书是什么意思 鱼雁传书的书是什么意思 驿骑传书什么意思? 鸿雁传书什么意思 真三国无双5传书什么意思?是什么? 鸿雁传书的书字是什么意思? 飞鸿传书是什么意思? psp真三国无双5的 传书 是什么意思? 环宇传书的意思 什么传书什么成语什么什么什么 小米手机解锁的时候有蓝框解锁不开了 为什么我在小商店助手里上架的商品不出现在视频号橱窗里?橱窗只有带货商品,没有自己的商品?_百度问一问