乙個人去完成一件事情,如果派多個人去做的話,只要配合默契,效率比乙個人做肯定要高,效率提高,所需的時間就減少了。如果只能乙個人完成,那麼必須設法提高自己的勞動效率,這個提高可以是量的改變也可以是質的改變。我把這個量的改變稱為空間上的改變,也就是說空間和時間是可以相互轉換的。
按照解析原理與過濾器的原理一次用迴圈遞迴去匹配查詢,這樣的效率是很慢的,那麼sizzle從給1.8開始就引入了編譯的概念,就是空間換時間的演算法通過快取大量的閉包匹配器從而提高重複的效率
閉包是js的特性,我們經常會用來作為私有變數的儲存處理,那麼sizzle就很好的利用了這一特性,把選擇器中每乙個選擇原子都變成了函式的處理方法,然後通過閉包儲存著。在快取在記憶體中去,這樣有重複使用的時候就會首先呼叫快取。
sizzle對於編譯這個最終的過濾器閉包是非常繞的,先通過簡單的例子去展示這個乙個複雜的思路。
var filter =}return
false
; }
},tag:
function
(nodenameselector) ;
}}function
addcombinator(matcher) }}
}function
elementmatcher(matchers)
}return
true
; } :
//單個匹配器的話就返回自己即可
matchers[0];
}function
matcherfromtokens(tokens)
else
}return
elementmatcher(matchers);
}function
compile() , , ]
elementmatchers.push(matcherfromtokens(match));
varmatcher, elem;
for (var i = 0; i < seed.length; i++)
}console.log(results)
}compile();
拋開偽類的處理,這裡就是乙個簡化版的sizzle的流程
測試,高階瀏覽器
sizzle編譯函式
乙個人去完成一件事情,如果派多個人去做的話,只要配合默契,效率比乙個人做肯定要高,效率提高,所需的時間就減少了。如果只能乙個人完成,那麼必須設法提高自己的勞動效率,這個提高可以是量的改變也可以是質的改變。我把這個量的改變稱為空間上的改變,也就是說空間和時間是可以相互轉換的。按照解析原理與過濾器的原理...
Sizzle選擇器揭秘 Sizzle過濾器
上面一篇文章說的sizzle的利器之一find函式sizzle選擇器揭秘 sizzle選擇器 這篇介紹sizzle的另一利器filter函式 1 sizzle.filter function expr,set,inplace,not 20 用於縮小結果集 21 if curloop result 2...
sizzle分析記錄 分解流程
js form div p name aaron 解析的流程 編譯器 分5個步驟 涉及 tag元素 關係選擇器 屬性選擇器 1 通過tokenize詞法分析器分組 2 遍歷tokens,從右邊往左邊開始篩選,最快定位到目標元素合集 先看看有沒有搜尋器find,搜尋器就是瀏覽器一些原生的取dom介面,...