jQuery Sizzle.find [ 源碼分析 ]
Sizzle.find = function( expr, context, isXML ) {var set, i, len, match, type, left;//expr是否為空白if ( !expr ) {return [];}for ( i = 0, len = Expr.order.length; i < len; i++ ) {type = Expr.order[i];//根據Expr.order,即Sizzle.selectors.order 的四種類型:ID,CLASS,NAME,TAG//與leftMatch確定 expr 的類型if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {//left 官方說是為了確定之後的運算式是否有被轉義,//人個認為這裡的left基本沒有意義left = match[1];match.splice( 1, 1 );if ( left.substr( left.length - 1 ) !== "\\" ) {//對match[1] 中的進行再次轉換,如 \: 轉義為 : ,\. 轉為 .match[1] = (match[1] || "").replace( rBackslash, "" );//針對不同的type調用不同的find方法,返回查詢結果,對應的元素集合set = Expr.find[ type ]( match, context, isXML );//查詢結果不為空白,那麼刪除掉已經查詢過的運算式if ( set != null ) {expr = expr.replace( Expr.match[ type ], "" );break;}}}}//如果結果為空白,那麼採用如下方式尋找if ( !set ) {set = typeof context.getElementsByTagName !== "undefined" ?context.getElementsByTagName( "*" ) :[];}//返回臨時結果return { set: set, expr: expr };};