標籤:

關於 jQuery,什麼叫隱式迭代(implicit iteration)?

最近在看jQuery,書里出現「隱式迭代」,不太明白要說明的是什麼。


舉幾個例子就明白了。

$(".className") 這其實是一個數組集合,並不是直接的DOM元素

所以像 $(".className").addClass("newClass"),執行的其實是類似這樣的語句

$(".className").each(function() {

$(this).addClass("newClass");

});

還有一些例子,比如

$(".notExistClass").addClass("newClass");

即使沒有符合$(".notExistClass")條件的DOM元素,jQuery同樣也不會報錯。

再比如

$(".className"),其實是一個數組集合,符合這個表達式的DOM元素可能超過1個

但是 $(".className").attr("id") 返回的只是第一個DOM元素的屬性值。

不知道這樣說,清楚不?


簡單來說:

$(".class")返回的是一個對象數組,對其調用方法其實是對每個數組中每個元素迭代調用這個方法,相當於使用了循環,遍曆元素調用方法。

具體舉例請看@楊帆 的回答。:)


對於滿足的每個對象,重複執行


不用自己去寫for 遍歷 dom數組了,自動為每個數組元素循環加了執行方法,隱藏起來 迭代 賦予每個數組元素 執行方法。


每當我們調用選擇器方法查找dom樹里的元素時,其實就是把找到的dom元素存入一個JQ對象里的dom數組中,然後再把這個JQ對象返回。

當我們調用Jquery方法時(如 html()),jq方法會遍歷內部 dom數組,並調用每個dom元素的對應的dom屬性或方法(如innerHTML),完成操作。

其中Jq方法遍歷內部dom數組的過程就叫做隱式迭代


其實對於這塊還是有一點尋思不到的,就是比如我們去查找一個ID的DOM,可能是這樣:

&&

&&

&&

document.getElementById("app") 那麼我使用這句話去查找,只會查找到第一個元素。其實是jq在你看不到的地方替你做了循環。

我們實現思路可以是這樣:先獲取到頁面上所有的div,接著按個比對,只要 id與 用戶調用時傳入的id匹配到了,那麼就push到隊列裡面,接著往下執行。

覺得這個思路性能是比較差的。求各位大神推薦更好的思路。


推薦閱讀:

用 js 和 css3 做動畫時,如何判斷所有的圖片元素都載入完了?
你是如何打造自己的前端庫(css+js,主要是js了)的?
如何清除頁面上已有的js?
handlebars這個前端模板引擎如何,有類似的模板引擎推薦嗎?

TAG:JavaScript | jQuery |