這次來學習一下Partial Application。我們先來看看函數的介紹,在維基上有簡單的介紹:
在數學中,一個函數是描述每個輸入值對應唯一輸出值的這種對應關係,符號為 f(x)。例如,表達式 f(x)=x2表示了一個函數 f,其中每個輸入值x都與唯一輸出值x2連結。
因此,如果一個輸入值為3,那麼它所對應的輸出值為9。而g(x,y) = xy有兩個參量x和y,以積xy為值。上面描述了函數(為方便假設x,y都是int),並且給了函數的兩個例子,先換個方式來看,f(x)可以表示為:x -> y(x2),即經過f到x2的映射,寫成int -> int。
接受一個int 回傳一個int。再看g(x,y)可以表示為:x -> y -> z(xy)。即x,y經過g的映射到z,寫成 int -> int -> int。我們看g(x,y)函數,用javascript來實作一下:
function g(x,y){
return x*y;
}
很完美啊,很接近數學定義。它依次接受兩個參數,x與y。並且傳回它們兩個的乘積。但是當x是個常數,例如x=n(n是一個自然數)。那麼g(n,y)=ny。這就變成一個常數與一個變數的乘積,它接受一個參數y回傳ny,也就是y -> z(ny) 的映射,寫成 int -> int。因此,我們可以這樣來理解上面的工作,g(x,y)是接受一個參數int,並且傳回一個函數 int ->int 。這個傳回的函數只接受一個int 並且回傳一個int。來用javascript表示一下:
var h = g(2 );
這裡的h表示函數h(y)=2y。這樣就有h(5)=10,h(13)=26等。
h(5);
h(13) ;
這個技巧是把需要多個參數的函數形式轉變為接受單一參數的函數鏈,它通常叫做Curring,這是為了紀念Haskell Curry而起的名字,但他並不是第一個提出的1。但是很遺憾的是javascript並不支援這樣的特性。所以要實現這樣的特性需要做一些工作,這些工作並不複雜。主要是把參數儲存起來,等待呼叫函數鏈上的下一個函數時拿出前邊參數繼續傳遞給鏈上的下一個函數,直到最後得到回傳值。先看一下下面的程式碼:
function atarr(a,function atarr(a, index){
var index=index||0,args = new Array(a.length - index);
for(var i in a){
if(i>=index) args[i -index]=a[i];
}
return args;
}
function m(scope,fn){
if(arguments.lengthvar p = atarr(arguments,2);
return function(){
var args = atarr(arguments);
return fn.apply(scope,p.concat(args ));
}
}
測試代碼:
var plus = function(a,b){
return a b;
};
var plus2 = m(null,plus,2);
console.log(plus2(10));
console.log(plus2(0));
//結果
12
2
這樣我們的目標已經實現啦。在上面的atarr函數是將arguments物件中指定位置開始的參數取出並且儲存到一個陣列中。 m函數就是主角,它完成了前面定義的任務,實現了保存函數鏈上的參數並且返接受餘下參數的函數。測試程式碼中的plus函數原先接受a,b兩個參數並回傳a與b之和,即int -> int -> int,而plus2則變成了接受一個參數b與2相加,並回傳2與b之和,即int -> int。
透過上面的一些工作,我們實作了javascript中的Partial Application,在dojo框架中hitch2實作了域綁定和partial。有興趣可以讀它的源碼,也是非常簡單明了的。

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

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

10款趣味橫生的jQuery遊戲插件,讓您的網站更具吸引力,提升用戶粘性!雖然Flash仍然是開發休閒網頁遊戲的最佳軟件,但jQuery也能創造出令人驚喜的效果,雖然無法與純動作Flash遊戲媲美,但在某些情況下,您也能在瀏覽器中獲得意想不到的樂趣。 jQuery井字棋遊戲 遊戲編程的“Hello world”,現在有了jQuery版本。 源碼 jQuery瘋狂填詞遊戲 這是一個填空遊戲,由於不知道單詞的上下文,可能會產生一些古怪的結果。 源碼 jQuery掃雷遊戲

本教程演示瞭如何使用jQuery創建迷人的視差背景效果。 我們將構建一個帶有分層圖像的標題橫幅,從而創造出令人驚嘆的視覺深度。 更新的插件可與JQuery 1.6.4及更高版本一起使用。 下載

本文討論了在瀏覽器中優化JavaScript性能的策略,重點是減少執行時間並最大程度地減少對頁面負載速度的影響。

本文演示瞭如何使用jQuery和ajax自動每5秒自動刷新DIV的內容。 該示例從RSS提要中獲取並顯示了最新的博客文章以及最後的刷新時間戳。 加載圖像是選擇

Matter.js是一個用JavaScript編寫的2D剛體物理引擎。此庫可以幫助您輕鬆地在瀏覽器中模擬2D物理。它提供了許多功能,例如創建剛體並為其分配質量、面積或密度等物理屬性的能力。您還可以模擬不同類型的碰撞和力,例如重力摩擦力。 Matter.js支持所有主流瀏覽器。此外,它也適用於移動設備,因為它可以檢測觸摸並具有響應能力。所有這些功能都使其值得您投入時間學習如何使用該引擎,因為這樣您就可以輕鬆創建基於物理的2D遊戲或模擬。在本教程中,我將介紹此庫的基礎知識,包括其安裝和用法,並提供一


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

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

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

Dreamweaver CS6
視覺化網頁開發工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具