什麼是柯裡化
柯裡化是這樣的一個轉換過程,把接受多個參數的函數變換成接受一個單一參數(譯注:最初函數的第一個參數)的函數,如果其他的參數是必要的,返回接受余下的參數且返回結果的新函數。
柯理化函數思想:一個js預先處理的思想;利用函數執行可以形成一個不銷毀的作用域的原理,把需要預先處理的內容都儲存在這個不銷毀的作用域中,並且返回一個小函數,以後我們執行的都是小函數,在小函數中把之前預先存儲的值進行相關的操作處理即可;
柯裡化函數主要起到預處理的作用;
bind方法的作用:把傳遞進來的callback回調方法中的this預先處理為上下文context;
bind方法實現原理1代碼如下所示:
/** * bind方法實現原理1 * @param callback [Function] 回調函數 * @param context [Object] 上下文 * @returns {Function} 改變this指向的函數 */ function bind(callback,context) { var outerArg = Array.prototype.slice.call(arguments,2);// 表示取當前作用域中傳的參數中除了fn,context以外後面的參數; return function (){ var innerArg = Array.prototype.slice.call(arguments,0);//表示取當前作用域中所有的arguments參數; callback.apply(context,outerArg.concat(innerArg)); } }
下面一段代碼模仿在原型鏈上的bind實現原理
/** * 模仿在原型鏈上的bind實現原理(柯理化函數思想) * @param context [Object] 上下文 * @returns {Function} 改變this指向的函數 */ Function.prototype.mybind = function mybind (context) { var _this = this; var outArg = Array.prototype.slice.call(arguments,1); // 兼容情況下 if('bind' in Function.prototype) { return this.bind.apply(this,[context].concat(outArg)); } // 不兼容情況下 return function () { var inArg = Array.prototype.slice.call(arguments,0); inArg.length === 0?inArg[inArg.length]=window.event:null; var arg = outArg.concat(inArg); _this.apply(context,arg); } }
函數柯裡化(Currying)
在計算機科學中,柯裡化是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,並且返回接受余下的參數而且返回結果的新函數的技術
柯裡化就是預先將某些參數傳入,得到一個簡單的函數。但是預先傳入的參數被保存在閉包中,因此會有一些奇特的特性。比如:
例:
var adder = function(num) { return function(y) { return num + y; } } var inc = adder(1); var dec = adder(-1); //inc, dec現在是兩個新的函數,作用是將傳入的參數值(+/-)1 alert(inc(99));//100 alert(dec(101));//100 alert(adder(100)(2));//102 alert(adder(2)(100));//102
以上內容是小編給大家介紹的JavaScript函數柯裡化及實現bind方法的方法,希望對大家有所幫助!