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灯, 水草

请输入看板名称,例如:iOS站内搜寻

TOP