日期:2014-05-16  浏览次数:20319 次

javascript 事件的一点认识
不知不觉写了两年的javascript(比较怀念写java的日子),用过jquery和mootools。关于这两个框架的对比也看过不少,之前一直也想说些什么,现在就不想这样做了,因为一定要说有区别的话那就是编码的样子不是很一样,mootools是扩展式的,入侵原生属性,你一加载就穿了装备,随时候命,调用方便;jquery是外挂式的,你来我才给你装备,不来你还是你,感觉会比较轻。你要是说mootools太拖拉,只是想拉屎也带整套装备,不也是图个方便,你敢说用jQuery就很少用到$吗,jQuery的$就是穿装备。

不要跑题,马上来说event,javascript事件,javascript事件有两种方式实现,一种是直接写在html里面类似onclick=xxx;一种是attachEvent或addEventListener(ie和ff不一样),可以认为是绑定在节点上(这里说的节点是指dom对象,后同)。

我是这样想的,节点的事件有两种映射方式存在,当你点击节点的时候,浏览器会扫描节点的onclick属性,然后eval这个属性的值(可能不是eval,而是浏览器底层的其他接口,反正类似),这样看来,这个映射他是不存在的,每次点击的时候扫描;另外会去一个特定的地方(内存)寻找是否存在映射到其他js函数,这里因为我们在html里面看不到事件,有理由认为这是存放在内存里面,当你attach或者add一个event之后一定在内存里面存放了映射提供给浏览器扫描。所以我认为,使用onclick的方式不占内存或者说比较小,但是可能扫描的性能方面会差点(纯属yy),最重要的是管理起来麻烦;使用add方式(就这样叫了),类似拉了一条线在节点和函数之间,而且这条线是一直存在的,占内存,好处是脱离html,好管理。

这里说说ie的问题,查过一些资料说,ie的gc是很差的,当你删掉一个节点的时候,你add进来的事件ie是不管的,类似拉屎,ie就是一个马桶你按了下冲水,他会把你拉的屎清理,但他是不会帮你差屁股的,ie不会帮你回收那条线,原因可能是ie太老了,以前只是被设计成一个粪池,只是负责装屎(如果觉得太恶心,请回复发泄一下)。ie内存泄露根本原因。jquery的data和mootools的store方法估计也会因此而泄露。所以说ie恶心。

在这里呼吁一下,如果你的浏览器还是ie6的话请你更新至新的版本(或者换其他新的浏览器)。

先这样,很少写这么无聊的技术。