1. 程式人生 > >js函數柯裏化,實現bind

js函數柯裏化,實現bind

區別 nbsp inf https .com 引用 復制 name all

1、柯裏化:

把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,並且返回接受余下的參數而且返回結果的新函數的技術。

舉個栗子:

一個計算兩數之和的函數,需要傳遞兩個參數,柯裏化後,這個方法只接受一個參數,但是返回一個函數,用來接收第二個參數

function add(a,b){
  return a+b;  
}

//柯裏化後

function add(a){
  return function(b){
    return a+b;
  }  
}

//調用
add(1)(2) //3

柯裏化實際上是使用的閉包原理。

2、實現 add(1)(2)(3,4,5)

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

3、利用柯裏化實現js的bind方法

js的call,apply,bind方法的具體使用和區別可以到這位同學的博文裏(https://www.cnblogs.com/libin-1/p/6069031.html),寫的很詳細。

柯裏化可以延遲執行某個函數,所以調用bind方法時不是立即執行的

Function.prototype.b=function(){
  var args = [].slice.apply(arguments);
  var
scope = args.slice(0,1);//傳入的作用域 var params = args.slice(1);//傳入的參數 return function(){ //此時的this為調用b時的方法 this.apply(scope,params); } } function c(){ return this.name; } //註意bind後要再執行一次,因為bind()不會立即執行需要綁定作用域的方法 console.info(c.bind({name:123})()) //123

js函數柯裏化,實現bind