搜尋
首頁web前端js教程jQuery鍊式運算如何實作以及為什麼要用鍊式運算_jquery

兩個問題
1.jQuery的鍊式運算是如何實現的?
2.為什麼要用鍊式運算?
大家認為這兩個問題哪個好回答一點呢?

鍊式操作
原理相信百度一下一大把,實際上鍊式操作只是透過物件上的方法最後
return this
把物件再返回回來,物件當然可以繼續呼叫方法啦,所以就可以鍊式操作了。那麼,簡單實作一個:
複製程式碼 程式碼如下:


程式碼如下:




//定義一個JS類別
function Demo() {
}
//擴充它的prototype
Demo.prototype ={
setName:function (name) {
this. name = 名稱;
return this;
},
getName:function () {
return this.name;
},
setAge:function (age) {
this.age = age;
return this;
}
};
////工廠函數
function D() {
return new Demo();
} //去實作可鍊式的呼叫D().setName("CJ").setAge(18).setName();


但…為什麼要用呢?

複製程式碼

程式碼如下:


document.getElementById("ele").dosomething();
document.getElementById("ele").dootherthing();

複製代碼


代碼如下:


var ele = document.getElementById("ele" );
ele.dosomething();
ele.dootherthing();

而且兩行並沒有比一行多多少程式碼,甚至對應的封裝反而使得程式碼更多了。 最糟糕的是所有物件的方法回傳的都是物件本身,也就是說沒有回傳值,這不一定在任何環境下都適合。 舉個例子,我們想弄一個超大整數BigInteger(意思是如果用Javascript的Number保存可能會溢出的整數),順便擴展他的運算方法,會適合用鍊式操作麼? 例如運算31415926535 * 4 - 271828182,如果設計成鍊式風格的方法可能會是這樣的:

複製碼>
程式碼如下:

var result = (new BigInteger("31415926535")).multiply(new BigInteger("4")).subtract(new BigInteger("271828182") .val();
console.log("result == " result); 複製程式碼


程式碼如下:


var bigIntInteger" 31415926535");
var result1 = bigInteger.multiply(new BigInteger("4")).val(); var result2 = bigInteger.subtract(new BigInteger("271828182").bigInteger; console.log("result1 == " result1 ", result2 == " result2);
這似乎一點也不優雅了,和不用鍊式操作沒啥不同嘛!
那如果要求是原來的BigInteger不能改變呢?好吧,鍊式操作似乎不能滿足這個需求了。

那到底為什麼要用鍊式運算呢?
為了更好的非同步體驗
Javascript是無阻塞語言,所以他不是沒阻塞,而是不能阻塞,所以他需要透過事件來驅動,異步來完成一些本來需要阻塞進程的操作。

但是非同步程式設計是一種令人瘋狂的東西…運行時候是分離的倒不要緊,但是編寫程式碼時候也是分離的就…
常見的非同步程式設計模型有哪些呢?
回調函數
所謂的回呼函數,意指先在系統的某個地方對函數進行註冊,讓系統知道這個函數的存在,然後在以後,當某個事件發生時,再呼叫這個函數對事件進行回應。
複製程式碼 程式碼如下:

function f(num, callback){
if (numalert("呼叫低層函數處理!");
alert("分數不能為負,輸入錯誤!");
}else if(num==0){
alert("呼叫低階函數處理!");
alert("該學生可能未參加考試!");
}else{
alert("呼叫高層函數處理!");
setTimeout(function(){callback();}, 1000);
}
}

這裡callback則是回呼函數。可以發現只有當num為非負數時候callback才會呼叫。
但是問題,如果我們不看函數內部,我們並不知道callback會幾時調用,在什麼情況下調用,代碼間產生了一定耦合,流程上也會產生一定的混亂。

雖然回呼函數是一種簡單而易於部署的實現非同步的方法,但從程式設計體驗來說它卻不夠好。
事件監聽
也就是採用事件驅動,執行順序取決於事件順序。
複製程式碼 程式碼如下:

function EventTarget(){


function EventTarget(){
this.handlers = {};
}
EventTarget.prototype = {
constructor: EventTarget,
addHandler: function(type, handler){
this.handlers[type] = [];
},
fire: function(){
if(!event.target){
event.target = this;
}
if(this.handlers[event.type instanceof Array] ){
var handlers = this.handlers[event.type];
for(var i = 0, len = handlers.length, i handlers[i](event) ;
}
}
},
removeHandler: function(type, handler){
if(this.handlers[type] instanceof Array){
var handlers = this.handlers = this.handlers = this.handlers = this.handlers = this.handlers = this.handlers = this.handlers = this.handlers = this.handlers = this.handlers [類型];
for(var i = 0, le = handlers.length; i if(handlers[i] === handler){
break;
}
}
handlers.splice(i, 1);
}
}
};


上面是《JavaScript高級程式設計》中的自白定義事件實作。於是我們就可以透過addHandler來綁定事件處理函數,用fire來觸發事件,用removeHandler來刪除事件處理函數。 雖然透過事件解耦了,但流程順序更混亂了。

鍊式非同步
個人覺得鍊式操作最值得稱讚的還是其解決了非同步程式設計模型的執行流程不清晰的問題。 jQuery中$(document).ready就非常好的詮釋了這個理念。 DOMCotentLoaded是一個事件,在DOM並未加載前,jQuery的大部分操作都不會奏效,但jQuery的設計者並沒有把他當成事件一樣來處理,而是轉成一種“選其對象,對其操作”的思路。 $選擇了document對象,ready是其方法進行操作。這樣子流程問題就非常清楚了,在鏈條越後位置的方法就越後執行。 複製程式碼
程式碼如下:

(function(){
var isReady=false; //判斷onDOMReady方法是否已經被執行過
var readyList= [];//把需要執行的方法先暫存在這個陣列裡
var timer;//定時器句柄
ready=function(fn) {
if (isReady )
fn.call( document);
else
readyList.push( function() { return fn.call(this);});
return this;
}
var onDOMReady=function(){
for(var i=0;ireadyList[i].apply(document);
}
readyList = null;
}
var bindReady = function(evt){
if(isReady) return;
isReady=true;
onDOMReady.call(window);
if(document.removeEventListener){
document.removeEventListener("DOMContentLoaded", bindReady, fsese); if(document.attachEvent){
document.detachEvent("onreadystatechange", bindReady);
if(window == window.top){
clear(timer);
timer = null }
}
};
if(document.addEventListener){
document.addEventListener("DOMContentLoaded", bindReady, false);
}el Event(documentse.
document.attachEvent("onreadystatechange", function(){
if((/loaded|complete/).test(document.readyState))
bindReady();
});
if(window == window.top){
timer = setInterval(function(){
try{
isReady||document.documentElement.doScroll('left');//在IE下用能否執行doScroll判斷dom是否載入完成
}catch(e){
return;
}
bindReady();
},5);
}
}
})();


上面的程式碼不能用$(document).ready,而應該是window.ready。

Promise
CommonJS中的非同步程式設計模型也延續了這個想法,每個非同步任務返回一個Promise對象,該物件有一個then方法,允許指定回調函數。
所以我們可以這樣寫
f1().then(f2).then(f3); 這種方法我們不需要太過關注實現,也不太需要理解異步,只要懂得透過函數選對象,透過then進行操作,就能進行非同步程式設計。
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
在JavaScript中替換字符串字符在JavaScript中替換字符串字符Mar 11, 2025 am 12:07 AM

JavaScript字符串替換方法詳解及常見問題解答 本文將探討兩種在JavaScript中替換字符串字符的方法:在JavaScript代碼內部替換和在網頁HTML內部替換。 在JavaScript代碼內部替換字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 該方法僅替換第一個匹配項。要替換所有匹配項,需使用正則表達式並添加全局標誌g: str = str.replace(/fi

自定義Google搜索API設置教程自定義Google搜索API設置教程Mar 04, 2025 am 01:06 AM

本教程向您展示瞭如何將自定義的Google搜索API集成到您的博客或網站中,提供了比標準WordPress主題搜索功能更精緻的搜索體驗。 令人驚訝的是簡單!您將能夠將搜索限制為Y

構建您自己的Ajax Web應用程序構建您自己的Ajax Web應用程序Mar 09, 2025 am 12:11 AM

因此,在這裡,您準備好了解所有稱為Ajax的東西。但是,到底是什麼? AJAX一詞是指用於創建動態,交互式Web內容的一系列寬鬆的技術。 Ajax一詞,最初由Jesse J創造

示例顏色json文件示例顏色json文件Mar 03, 2025 am 12:35 AM

本文系列在2017年中期進行了最新信息和新示例。 在此JSON示例中,我們將研究如何使用JSON格式將簡單值存儲在文件中。 使用鍵值對符號,我們可以存儲任何類型的

8令人驚嘆的jQuery頁面佈局插件8令人驚嘆的jQuery頁面佈局插件Mar 06, 2025 am 12:48 AM

利用輕鬆的網頁佈局:8 ESTISSEL插件jQuery大大簡化了網頁佈局。 本文重點介紹了簡化該過程的八個功能強大的JQuery插件,對於手動網站創建特別有用

什麼是這個'在JavaScript?什麼是這個'在JavaScript?Mar 04, 2025 am 01:15 AM

核心要點 JavaScript 中的 this 通常指代“擁有”該方法的對象,但具體取決於函數的調用方式。 沒有當前對象時,this 指代全局對象。在 Web 瀏覽器中,它由 window 表示。 調用函數時,this 保持全局對象;但調用對象構造函數或其任何方法時,this 指代對象的實例。 可以使用 call()、apply() 和 bind() 等方法更改 this 的上下文。這些方法使用給定的 this 值和參數調用函數。 JavaScript 是一門優秀的編程語言。幾年前,這句話可

通過來源查看器提高您的jQuery知識通過來源查看器提高您的jQuery知識Mar 05, 2025 am 12:54 AM

jQuery是一個很棒的JavaScript框架。但是,與任何圖書館一樣,有時有必要在引擎蓋下發現發生了什麼。也許是因為您正在追踪一個錯誤,或者只是對jQuery如何實現特定UI感到好奇

10張移動秘籍用於移動開發10張移動秘籍用於移動開發Mar 05, 2025 am 12:43 AM

該帖子編寫了有用的作弊表,參考指南,快速食譜以及用於Android,BlackBerry和iPhone應用程序開發的代碼片段。 沒有開發人員應該沒有他們! 觸摸手勢參考指南(PDF)是Desig的寶貴資源

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
1 個月前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器