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進行操作,就能進行非同步程式設計。

Node.js擅長於高效I/O,這在很大程度上要歸功於流。 流媒體匯總處理數據,避免內存過載 - 大型文件,網絡任務和實時應用程序的理想。將流與打字稿的類型安全結合起來創建POWE

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

是的,JavaScript的引擎核心是用C語言編寫的。 1)C語言提供了高效性能和底層控制,適合JavaScript引擎的開發。 2)以V8引擎為例,其核心用C 編寫,結合了C的效率和麵向對象特性。 3)JavaScript引擎的工作原理包括解析、編譯和執行,C語言在這些過程中發揮關鍵作用。

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

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

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

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

SublimeText3 Linux新版
SublimeText3 Linux最新版

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