1. 程式人生 > >jQuery源碼解析(架構與依賴模塊)

jQuery源碼解析(架構與依賴模塊)

源碼 cto and click dom元素 ack bsp 性能 selector

回溯處理

jQuery對象棧:jQuery內部維護著一個jQuery對象棧。每個遍歷方法都會找到一組新元素(一個jQuery對象),然後jQuery會把這組元素推入到棧中。

而每個jQuery對象都有三個屬性:context、selector和prevObject,其中的prevObject屬性就指向這個對象棧中的前一個對象,而通過這個屬性可以回溯到最初的DOM元素集中。

jQuery為我們操作這個內部對象棧提供個非常有用的2個方法

.end() : 就是回溯到上一個Dom合集,因此對於鏈式操作與優化,這個方法還是很有意義的。

.addBack()

這裏需要指出來可能有些API上是andSelf,因為就Query的api是這樣寫的,andSelf現在是.addBack()的一個別名。在jQuery1.8和更高版本中應使用.addBack()

源碼其實也是這樣的

jQuery.fn.andSelf = jQuery.fn.addBack;

調用第一個方法只是簡單地彈出一個對象(結果就是回到前一個jQuery對象)。第二個方法更有意思,調用它會在棧中回溯一個位置,然後把兩個位置上的元素集組合起來,並把這個新的、組合之後的元素集推入棧的上方。

利用這個DOM元素棧可以減少重復的查詢和遍歷的操作,而減少重復操作也正是優化jQuery代碼性能的關鍵所在。

 1 $("#end").click(function(){
 2               $(‘ul.first‘).find(‘.foo‘).css(‘background-color‘, ‘red‘)
3 .end().find(‘.bar‘).css(‘background-color‘, ‘green‘); 4 }) 5 //addBack包含了自身的選擇器 6 $("#addBack").click(function(){ 7 //nextAll()為選擇器的所有兄弟節點,addBack指向的是前面所有的選擇器 8 $(‘.foo‘).nextAll().addBack() 9 .css(‘background-color‘, ‘red‘);
10 console.log($(‘.foo‘).nextAll()); 11 })

jQuery源碼解析(架構與依賴模塊)