我在看sizzle和peppy的源代码,发现他们的速度还有提升的空间,
我准备使用jit技术实现一个世界最快的javascript css3 selector engine.
css3选择器也有一些不方便
比如说伪类选择器,只运行"且"选择,不运行"或"选择,要"或"的话,把前面的抄下来吧,效率低多了.
经过jit编译过后的selector成为一个函数,接受一个参数ct,表示容器.选择器将从这个容器开始选择.
该函数执行时,直接引用一些编译期间确定的变量,而且避免函数调用(相当于c++内联函数),合并相邻的伪类选择器.
query函数接受参数ql,ct,rs
ql:查询语句
ct:查询容器
rs:查询结果
query函数首先根据ql和ct查询缓存,如果以前用同样的语句和容器查询过并且文档未改变,则有缓存可以直接返回.
将结果合并到rs返回.
如果不存在缓存则查询是否存在ql编译好的selector的缓存,如果以前编译过一次,那么就不用再编译了,直接用缓存里编译好的.