一、傳統(tǒng)方法不為人所知的細(xì)節(jié) 毫無疑問,在判斷函數(shù)類型時(shí),我們使用的是typeof方法,比如: 復(fù)制代碼 " /> 色妺妺免费影院,老熟人老女人国产老太,狠狠综合久久综合88亚洲

天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

Javascript 判斷函數(shù)類型完美解決方案

但是,有一些細(xì)節(jié)并不為我們所熟知。John Resig 在分析了這些細(xì)節(jié)之后,為我們提供了一個(gè)完美的解決方案,本文將作詳細(xì)介紹:

一、傳統(tǒng)方法不為人所知的細(xì)節(jié)
毫無疑問,在判斷函數(shù)類型時(shí),我們使用的是typeof方法,比如:
復(fù)制代碼 代碼如下:
function fn(){
//content
}
alert(typeof fn)//結(jié)果是"function"。

但是,該方法在一些瀏覽器中并不是像我們想像的那樣工作。

1、Firefox2和Firefox3
在這兩個(gè)瀏覽器中,用typeof檢測HTML對象元素的類型,得到是一個(gè)不精確的“function”結(jié)果,而不是“object”,如HTMLDocument。如:
復(fù)制代碼 代碼如下:
alert(typeof HTMLDocument);
//在Firefox2中結(jié)果是"function";
//在Firefox3中結(jié)果是"object";

2、Firefox2
對于正則表達(dá)式,在該瀏覽器中返回的結(jié)果是“function”(在Firefox3中結(jié)果是“object”),如:
復(fù)制代碼 代碼如下:
var reg = /test/;
alert(typeof reg);
//在Firefox2中結(jié)果是"function";
//在Firefox3中結(jié)果是"object";

注:本人在safari中測試,其結(jié)果也是“function”。
3、IE6和IE7
在IE中對DOM元素使用typeof方法,得到的結(jié)果是“object”。如:
復(fù)制代碼 代碼如下:
alert(typeof document.getElementsByTagName("body")[0].getAttribute);
//結(jié)果是"object"

4、Safari 3
safari認(rèn)為DOM元素的NodeList是一個(gè)函數(shù),如:
復(fù)制代碼 代碼如下:
alert(typeof document.body.childNodes);
//結(jié)果是"function"

很明顯,如果你要測試一個(gè)對象是否為函數(shù),使用typeof方法并不能從真正意義上保證測試結(jié)果。那么,我們就需要一種在所有瀏覽器中都能保證測試結(jié)果的解決方案。我們知道function本身有apply()和call()兩種方法,但這兩個(gè)方法在IE中存在問題的函數(shù)中并不存在,試試下面的測試:
復(fù)制代碼 代碼如下:
alert(typeof document.getElementsByTagName("body")[0].getAttribute.call)
//在IE中結(jié)果是"undefined"

顯然,我們不能利用這兩個(gè)方法。

二、完美解決方案及實(shí)現(xiàn)過程
John Resig為我們提供了一個(gè)完美的解決方案,這個(gè)復(fù)雜但很穩(wěn)定的判斷一個(gè)對象是否為函數(shù)的方法如下:
復(fù)制代碼 代碼如下:
function isFunction( fn ) {
return !!fn && !fn.nodeName && fn.constructor != String &&
fn.constructor != RegExp && fn.constructor != Array &&
/function/i.test( fn + "" );
}

這個(gè)函數(shù)首先保證測試的對象存在,并將其序列化成含有“function”的字符串,這個(gè)是我們檢測的基礎(chǔ)(fn.constructor != String,fn.constructor != Array, and fn.constructor != RegExp)。另外,我們需要保證聲明的函數(shù)不是一個(gè)DOM節(jié)點(diǎn)(fn.nodeName)。然后,我們就可以作toString測試。如果我們將一個(gè)函數(shù)轉(zhuǎn)換成字符串,在一個(gè)瀏覽器中(fn+"")給我們的結(jié)果就像這樣“function name(){...}”?,F(xiàn)在,判斷它是否為函數(shù)就很簡單,僅僅只需要判斷字符串中是否包含單詞“function”。這很神奇,對于任何有問題的函數(shù),在所有瀏覽器中都能得到我們所需要的結(jié)果。這個(gè)函數(shù)較之于傳統(tǒng)的方法,運(yùn)行速度有些不盡人意,作者建議我們保守使用。

John Resig 是jQuery庫的開發(fā)者,相信使用該庫的朋友們對該庫簡潔的語法和優(yōu)秀的性能并不陌生。作者除追求代碼簡潔和性能高效之外,其盡善盡美的精神也讓人嘆服。如果你是一個(gè)完美主義者,相信此文對你很有幫助。

JavaScript技術(shù)Javascript 判斷函數(shù)類型完美解決方案,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 成人免费视频在线播放 | 99re久久热在线视频 | 天天靠天天擦天天摸 | 国内精品自产拍在线少密芽 | 亲胸揉胸膜下刺激视频网站APP | 欧美丰满熟妇无码XOXOXO | 久久爽狠狠添AV激情五月 | 青草伊人久久 | 理论片在线观看片免费 | 成人影片大全 | 在线播放性xxx欧美 在线播放午夜理论片 | av在线观看网站免费 | 久久婷婷五月综合色情 | 999久久狠狠免费精品 | 青青草原直播 | 亚洲精品一二三 | 免费播放美女一级毛片 | 69日本xxⅹxxxxx18 | 大香伊人中文字幕精品 | 亚洲在线视频自拍精品 | 一个人在线观看免费高清视频 | 国产精品1区在线播放 | 在线亚洲精品国产一区麻豆 | 美女拔萝卜| 特黄大片aaaaa毛片 | 攻把受做得合不拢腿play | 久久人妻少妇嫩草AV无码 | 欧美黑人巨大性极品hd欧 | 亚洲黄色在线观看 | 久久亚洲精品AV无码四区 | 被肉日常np快穿高h 被肉日常np高h | 在线看片成人免费视频 | yy8090理论三级在线看 | 久草网国产自偷拍 | 久久青青草原综合伊人 | 看看妇女的B免费看 | 免费看a视频| 校园高h肉耽文 | 国产一区二区青青精品久久 | 亚洲欧美综合中文 | 亚洲乱码国产一区三区 |