var Sizzle = function( selector, context, results, seed ) {......}
jQuery选择器主体流程分析:
1.将selector第一个逗号(如果有的话)之前的部分解析为若干个块表达式(例如"div > span.big"将被解析为"div", ">", "span.big"三个表达式块),存入parts数组中,逗号之后的字符串存入extra中
2.如果parts中元素个数大于1,且selector中包含位置表达式,则采用left->right匹配策略
2.1 若parts中恰只有两个元素且第一个元素是一个关系表达符,则连接parts中的两个元素并作为posProcess的selector参数,以context作为posProcess的context参数,调用posProcess得到结果集set
2.2 否则,弹出parts头元素作为selector调用Sizzle,因此重复步骤1,得到的结果赋值给set;
2.2.1 若parts不为空,则弹出parts的头元素作为posProcess的selector参数,以set为posProcess的context数,调用posProcess将结果赋值给set;重复2.2.1
3.若selector中不包含位置表达式或parts中只有一个元素,则采用默认的right->left匹配策略
3.1 若context不为空
3.1.1 若seed不为空,说明有现成的候选集,则以seed为候选集且弹出parts尾元素作为筛选条件构建一个obj,赋值给ret;若seed为空,则弹出parts尾元素作为selector调用Sizzle.find,得到结果赋值给ret
3.1.2
3.2 若context为空,则置checkSet为[]
浙公网安备 33010602011771号