Ajax 板


LINE

※ 引述《s25g5d4 (死城盜賊)》之銘言: : 昨天研究了一下一本書 : 征服javascript : 對其中的this與函數作用域以及fn.call()很有興趣 : 就寫出了這個函數 其實覺得好像刻意為了寫this跟call多繞了幾圈耶 XD 而且我不太瞭解為什麼要特地弄個this.a, 其實弄成接回傳值就好啦。XD : if(!document.getElementsByClassName) { : document.getElementsByClassName=function(classN) { //用運算式創立函數 : var tag=this.firstChild; //this指向document : this.a=(this==document? [] : null); //每次從外部呼叫函數時 : do{ //清空陣列 : if(tag.hasChildNodes()) { : document.getElementsByClassName.call(tag,classN); : /* : *fn.call(a,arg)將會執行fn()並使fn()的作用域改為a arg則是參數 : *簡單的說就是this將會指向到tag : */ : } : if(tag.className==classN) : document.a.push(tag); : tag=tag.nextSibling; : }while(tag); : return document.a; : }; : } 我先把 getElementsByClassName 先換個名字, 弄個基礎測試環境是這個板本 http://fiddle.jshell.net/wWhQY/6/ 第一個版本,把奇怪的 document.a 換成抓遞迴回傳值 http://fiddle.jshell.net/wWhQY/7/ 第二個版本,把難懂的call換掉。(基本上能不用就不用,除非比較直覺) http://fiddle.jshell.net/wWhQY/8/ 第三個版本,把細部的邏輯拆出來,讓主線清楚 http://fiddle.jshell.net/wWhQY/9/ 本來想寫第四個版本,除了綁document原生物件,加綁綁 prototype, 這樣可以更像原生的getElementsByClassName 你可以從任意一個 Element 去取 _getElementsByClassName http://fiddle.jshell.net/wWhQY/10/ 不過測了一下,ie6 不支援從 Element加上prototype function, 所以這個版本就變成firefox only了(但firefox又不需要這東西..XD) : 寫的時候為了document.a搞到焦頭爛額... : 每次執行都要清除一次 那這樣執行到第六行時因為回呼函數也會被清除... : 所以只好改用this.a並加入一個判斷式 當this指向document時就清空this.a : 又因為this指向到document所以此時的this.a等於document.a : 當執行到第六行時的this就會指向到tag 所以這時候的this.a = tag.a所以給null : 因為用不到 當變數值指向null時就會被javascript編譯器回收 : 總之就是錯綜複雜 搞到我也亂了XDDDD : 所以... : IE6 must die! 其實你會覺得很混亂是因為你沒有把flow抓穩, 而全域變數在遞迴時的操作狀態又更為複雜, 這種遞迴呼叫,把flow抓穩是很重要的事情。:p 用至少一個sample去用腦袋逐行執行到底是必要的。 -- 我:一半的日子讓你說,我聽你說你的所有______________________________________ ______________________________________一半的日子我想說,對你說過去的所有:我 _______________________________________________________ 在討論中妥善扮演兼具聆聽與分享的角色,是我們一生的課題。 _______________________________________________________ --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.70.191.115
1F:→ TonyQ:btw 我覺得fiddle 對firebug不太友善 XD 有人跟我一樣感覺嗎 07/11 23:43
2F:→ TonyQ:或者應該反過來說,firebug對iframe不太友善。:p 07/11 23:43
3F:推 s25g5d4:就是..為了用this與call所以故意寫的@@ 我是覺得用傳值 07/12 00:06
4F:→ s25g5d4:如果有人居心不良的話就爆了@@ 07/12 00:06
5F:→ s25g5d4:一開始的想法就是去抓arguments[1] 07/12 00:07
6F:→ grence:開發還是用firebug,jsFiddle只是為了找個 host..測IE XD 07/12 00:12
7F:→ TonyQ:this/call 一樣可以因為居心不良而爆啊..XD 07/12 00:37
8F:→ TonyQ:再說,其實只要把函式隱藏起來,外面調用不到就很安全.. 07/12 00:38
9F:推 adamp3:fiddle真的滿不錯的啊 07/12 00:41







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Soft_Job站內搜尋

TOP