摘要:手賤搜了下函數柯里化,結果搜出騰訊的一篇反柯里化的文章中有趣的反柯里化技術,又犧牲不少腦細胞,趕緊吃飯,餓死了
原生bind方法
不同于jQuery中的bind方法只是簡單的綁定事件函數,原生js中bind()方法略復雜,該方法上在ES5中被引入,大概就是IE9+等現代瀏覽器都支持了(有關ES5各項特性的支持情況戳這里ECMAScript 5 compatibility table),權威指南上提到在ES3中利用apply模擬該方法的實現(JS權威指南中函數那章), 但無法真實還原該方法, 這也是真bind方法中的有趣特性。
首先bind不同于call和apply只是單純地設置this的值后傳參,它還會將所有傳入bind()方法中的實參(第一個參數之后的參數)與this一起綁定,我個人的理解是其后的參數也會作為綁定上下文的一部分,以下為《js權威指南》原文的說法:
The ECMAScript 5 bind() method does more than just bind a function to an object. It also performs partial application: any arguments you pass to bind() after the first are bound along with the this value.
關于這個特性看《權威指南》原文的栗子:
var sum = function(x,y) { return x + y }; var succ = sum.bind(null, 1); //讓this指向null,其后的實參也會作為實參傳入被綁定的函數sum succ(2) // => 3: 可以看到1綁定到了sum函數中的x
其次, bind()方法所返回的函數的length(形參數量)等于原函數的形參數量減去傳入bind()方法中的實參數量(第一個參數以后的所有參數),因為傳入bind中的實參都會綁定到原函數的形參,嗎的,繞死了, 舉個栗子:
function func(a,b,c,d){...} //func的length為4 var after = func.bind(null,1,2) //這里輸入了兩個實參(1,2)綁定到了func函數的a,b console.log(after.length) //after的length為 2
第三,當bind()所返回的函數用作構造函數的時候, 傳入bind()的this將被忽略,實參會全部傳入原函數,這樣說很抽象, 舉個栗子?
function original(x){ this.a=1; this.b =function(){return this.a + x} } var obj={ a:10 } var newObj = new (original.bind(obj,2)) //傳入了一個實參2 console.log(newObj.a) //輸出 1, 說明返回的函數用作構造函數時obj(this的值)被忽略了 console.log(newObj.b()) //輸出3 ,說明傳入的實參2傳入了原函數original函數柯里話的概念
以上就是ES5中bind方法的特性, 這種技術也被稱為函數柯里化,在看《js權威指南》的時候感覺這玩意逼格太高直接忽略了,最近又碰到這概念, 索性打算搞定他。
函數柯里化在百科的解釋為:
在計算機科學中,柯里化(Currying)是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,并且返回接受余下的參數且返回結果的新函數的技術。這個技術由 Christopher Strachey 以邏輯學家 Haskell Curry 命名的,盡管它是 Moses Schnfinkel 和 Gottlob Frege 發明的。
以上翻譯成人話就是:這種技術將多個參數的函數變成只帶一個參數的函數。bind方法就是該技術在js中的實踐。作為一個菜鳥, 目前只用過bind設置this的值, 碼這篇博客的目的就是厘清下bind的特性。
手賤搜了下函數柯里化,結果搜出騰訊的一篇反柯里化的文章(Javascript中有趣的反柯里化技術), 又犧牲不少腦細胞,趕緊吃飯,餓死了~~~~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/86137.html
摘要:作為函數式編程語言,帶來了很多語言上的有趣特性,比如柯里化和反柯里化。個人理解不知道對不對延遲執行柯里化的另一個應用場景是延遲執行。不斷的柯里化,累積傳入的參數,最后執行。 作為函數式編程語言,JS帶來了很多語言上的有趣特性,比如柯里化和反柯里化。 這里可以對照另外一篇介紹 JS 反柯里化 的文章一起看~ 1. 簡介 柯里化(Currying),又稱部分求值(Partial Evalu...
摘要:而在函數式編程中方法是獨立于數據的,我們可以把上面以函數式的方式在寫一遍你肯定會說,你是在逗我。對比兩個生成新函數的過程,沒有柯里化的相對而言就有一點啰嗦了。 我們都知道單一職責原則,其實面向對象的SOLID中的S(SRP, Single responsibility principle)。在函數式當中每一個函數就是一個單元,同樣應該只做一件事。但是現實世界總是復雜的,當把現實世界映射...
摘要:何為化柯里化化來源與數學家的名字編程語言也是以他的名字命名。因此柯里化的過程是逐步傳參,逐步縮小函數的適用范圍,逐步求解的過程。當在多次調用同一個函數,并且傳遞的參數絕大多數是相同的,那么該函數可能是一個很好的柯里化候選。 何為Curry化/柯里化? curry化來源與數學家 Haskell Curry的名字 (編程語言 Haskell也是以他的名字命名)。 柯里化通常也稱部分求值,其...
摘要:作為函數式編程語言,帶來了很多語言上的有趣特性,比如柯里化和反柯里化。在一些函數式編程語言中,會定義一個特殊的占位變量。個人理解不知道對不對延遲執行柯里化的另一個應用場景是延遲執行。不斷的柯里化,累積傳入的參數,最后執行。作為函數式編程語言,JS帶來了很多語言上的有趣特性,比如柯里化和反柯里化。 這里可以對照另外一篇介紹 JS 反柯里化 的文章一起看~ 1. 簡介 柯里化(Currying)...
閱讀 852·2023-04-25 23:59
閱讀 3748·2021-10-08 10:04
閱讀 1685·2019-08-30 14:05
閱讀 1018·2019-08-30 13:58
閱讀 494·2019-08-29 18:41
閱讀 1130·2019-08-29 17:15
閱讀 2324·2019-08-29 14:13
閱讀 2749·2019-08-29 13:27