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;
}
};
////工廠函數
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();
複製碼>
程式碼如下:
var result = (new BigInteger("31415926535")).multiply(new BigInteger("4")).subtract(new BigInteger("271828182") .val();
console.log("result == " result); 複製程式碼
程式碼如下:
var bigIntInteger" 31415926535");
這似乎一點也不優雅了,和不用鍊式操作沒啥不同嘛!
那如果要求是原來的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來刪除事件處理函數。 雖然透過事件解耦了,但流程順序更混亂了。
•
鍊式非同步
(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;i
}
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進行操作,就能進行非同步程式設計。

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

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

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

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

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

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

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

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


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

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

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

Dreamweaver Mac版
視覺化網頁開發工具

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

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