Jquery的$(selector).each()和$.each()區別實例詳解
我們都用過Jqurey中的each函數,都知道each()有兩種方式去調用,一種是透過$.each()調用,另一種是$(selector).each()去調用,那麼它們之間有什麼區別?
翻看一下Jquery原始碼就會知道,$.each()是核心的實現,$(selector).each()是呼叫的$.each(),先來分析一下$.each( )的原始碼(在底部):
each(obj,callback,args)函數接收3個參數:obj--要遍歷的物件或陣列、callback--要遍歷執行的回呼函數、args--自己指定的陣列(先無視)。
jQuery中each方法的實作使用call方法,call方法可以設定上下文,第一,在下例中數組each效果一樣,為什麼不直接呼叫呢?
透過call 可以改變this的指向。
var testCall = function(obj, callback){ callback.call(obj, 1); }
testCall(["一、改變this的指向", "二、函數內部可以透過this調用"], function(index){ //使用call方式調用,可以直接透過this存取call 的第一個參數傳入的物件。 this。
var test = function(obj, callback){ callback(obj, 1); }
test(["一、改變this的指向", "二、函數內部可以透過this調用"], function(index){ //不使用call方式調用,沒有使用this。 alert(this[index]); //undefined});
#jQuery.each 應該就是用call 修改的this 指向;
$.each([1,2,3], function (index, item) { console.log({index:index,value:item,_this:this}); });/* Object {index: 0, value: 1, _this: Number} Object {index: 1, value: 2, _this: Number} Object {index: 2, value: 3, _this: Number} */
沒看jQuery 原始碼,用callback.call 山寨個,應該實現方式是一樣的。
var each = function(arr, callback){ for( var index = 0 ; index < arr.length ; index++ ){ callback.call(arr[index], index, arr[index]); } } each([1,2,3], function (index, item) { console.log({index:index,value:item,_this:this}); });/* Object {index: 0, value: 1, _this: Number} Object {index: 1, value: 2, _this: Number} Object {index: 2, value: 3, _this: Number} */
注意:this,如果沒有 使用 call,在回呼函數中是沒辦法使用 this 的。
1.沒有args的情況
一般來說,args是不常用的,所以先不討論當if(args)成立的情況,也就是直接看在程式碼中標為灰色的部分,這也是each()函數核心的部分
if(isArray) { for(; i < length; i++) { value = callback.call(obj[i], i, obj[i]); if(value === false) { break; } } }
如果你要遍歷的對象,是數組類型,則進入此程式碼區塊
for循環
遍歷數組
的每個元素,然後利用call方法,執行obj[i].callback(i,obj[i]), 所以,自己再寫回調函數的時候,應該意識到jquery會用數組的每個物件去執行你的回呼函數,參數傳的是元素在陣列中index和該元素,同時回呼方法內部的this,也指向該元素; 下一行是判斷回呼函數是否傳回了值,如果回呼函數傳回false,則跳出該陣列的循環。 如果自己傳的物件也是可以遍歷的,程式碼和上面數組遍歷也是一樣的
else { for(i in obj) { value = callback.call(obj[i], i, obj[i]); if(value === false) { break; } } }
如果自己傳的是對象,則用for(x in y)遍歷物件
的屬性,
原理和上面一樣,只不過換成物件內部的屬性x,去執行回呼函數,相當於obj.attr.callback(i,obj.attr); 回掉函數中如果傳回false,也是會結束循環操作。 2.有args的情況
當呼叫each()有第三個參數的時候,就會進入下面的程式碼區塊,來分析下:
if(isArray) { for(; i < length; i++) { value = callback.apply(obj[i], args); if(value === false) { break; } } } else { for(i in obj) { value = callback.apply(obj[i], args); if(value === false) { break; } } }
同樣道理,會先判斷你要遍歷的物件是否是數組,如果是數組,則遍歷數組的元素obj[i],並執行obj[i].callback(args)注意!這個地方傳的參數是你自己傳入的args數組,這是和沒有args參數不一樣的地方,也就是說如果你調用each函數是傳入了自己的數組參數,回調函數的參數
列表就是你所傳的args數組。其他的同上。。 總結:$.each()和$(selector).each()的差別就是前者可以針對所有物件或陣列進行遍歷,而後者是針對jquery選擇器傳回的jquery內部物件進行遍歷,前者更強大一些 以上是Jquery的$(selector).each()和$.each()區別實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!
$(selector).each(callback,args)函數接收2個參數:callback--要遍歷執行的回呼函數、args--自己指定的陣列。明白了$.each()函數,$(selector).each就簡單了,翻開源碼,$(selector).each內部就是呼叫的$.each()函數,原始碼如下:each: function( callback, args ) {
return jQuery.each( this, callback, args );
},

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

在 Photoshop 中導出帶密碼保護的 PDF:打開圖像文件。點擊“文件”>“導出”>“導出為 PDF”。設置“安全性”選項,兩次輸入相同的密碼。點擊“導出”生成 PDF 文件。

H5、小程序和APP的主要區別在於:技術架構:H5基於網頁技術,小程序和APP為獨立應用程序。體驗和功能:H5輕便易用,功能受限;小程序輕量級,交互性好;APP功能強大,體驗流暢。兼容性:H5跨平台兼容,小程序和APP受平台限制。開發成本:H5開發成本低,小程序中等,APP最高。適用場景:H5適合信息展示,小程序適合輕量化應用,APP適合複雜功能應用。

CentOS 和 Ubuntu 的關鍵差異在於:起源(CentOS 源自 Red Hat,面向企業;Ubuntu 源自 Debian,面向個人)、包管理(CentOS 使用 yum,注重穩定;Ubuntu 使用 apt,更新頻率高)、支持週期(CentOS 提供 10 年支持,Ubuntu 提供 5 年 LTS 支持)、社區支持(CentOS 側重穩定,Ubuntu 提供廣泛教程和文檔)、用途(CentOS 偏向服務器,Ubuntu 適用於服務器和桌面),其他差異包括安裝精簡度(CentOS 精

在router文件夾下的index.js文件中註冊VueRouter的必要性在開發Vue應用程序時,常常會遇到關於路由配置的問題。特�...

DOM節點下XPath查找方法詳解在JavaScript中,我們經常需要根據XPath表達式從DOM樹中查找特定的節點。如果需要從某�...

不同數據庫系統添加列的語法為:mysql:alter table table_name add column_name data_type; postgresql:alter table table_name添加column_name data_type; oracle; oracle:alter table table_name add(column_name data_type)

Laravel 和 ThinkPHP 都是流行的 PHP 框架,在開發中各有優缺點。本文將深入比較這兩者,重點介紹它們的架構、特性和性能差異,以幫助開發者根據其特定項目需求做出明智的選擇。

H5與小程序的推廣方式存在差異:平台依賴性:H5依賴瀏覽器,小程序依賴特定平台(如微信)。用戶體驗:H5體驗較差,小程序提供類似原生應用的流暢體驗。傳播方式:H5通過鏈接傳播,小程序通過平台分享或搜索。 H5推廣方式:社交分享、郵件營銷、QR碼、SEO、付費廣告。小程序推廣方式:平台推廣、社交分享、線下推廣、ASO、與其他平台合作。
