一、柯里化:html
把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,而且返回接受餘下的參數並且返回結果的新函數的技術。閉包
舉個栗子:app
一個計算兩數之和的函數,須要傳遞兩個參數,柯里化後,這個方法只接受一個參數,可是返回一個函數,用來接收第二個參數函數
function add(a,b){ return a+b; } //柯里化後 function add(a){ return function(b){ return a+b; } } //調用 add(1)(2) //3
柯里化其實是使用的閉包原理。this
二、實現 add(1)(2)(3,4,5)spa
function add(){ var args = [].slice.call(arguments);//將參數複製到新的變量中 var adder = function(){ [].push.apply(args,[].slice.call(arguments));//args被內部函數引用,造成閉包 return adder; } adder.toS = function(){ //將全部輸入的參數累加 return args.reduce(function(a,b){ return a+b; }) } return adder();//此時要執行一次 } console.info(add(1,2,3)(4,5)(6).toS()) //21
三、利用柯里化實現js的bind方法prototype
js的call,apply,bind方法的具體使用和區別能夠到這位同窗的博文裏(https://www.cnblogs.com/libin-1/p/6069031.html),寫的很詳細。code
柯里化能夠延遲執行某個函數,因此調用bind方法時不是當即執行的。htm
Function.prototype.b=function(){ var args = [].slice.apply(arguments); var scope = args.slice(0,1);//傳入的做用域 var params = args.slice(1);//傳入的參數
var self = this;
return function(){ //此時的this爲調用b時的方法 self.apply(scope[0],params); } } function c(){ return this.name; } //注意bind後要再執行一次,由於bind()不會當即執行須要綁定做用域的方法 console.info(c.bind({name:'123'})()) //123