JavaScript深入---函數式編程

一、純函數

給定一個輸入總是返回相同的輸出

var double = (value) => value*2;

二、高階函數

1.什麼是高階函數

函數能夠被存儲、傳遞並像JavaScript其他數據類型一樣被賦值,這種極端JavaScript特性允許函數被傳遞給另一個函數,我們稱爲高階函數,高階函數就是接受另一個函數作爲參數或返回一個函數的函數

const forEach = (array,fn) => {
   let i;
   for(i=0;i<array.length;i++)
      fn(array[i])
}

2.數組中的高階函數

const every = (arr,fn) => {
    let result = true;

    for(const value of arr) {
        result = result && fn(value);
    }

    return result;
}

const some = (arr,fn) => {
    let result = false;

    for(const value of arr) {
        result = result || fn(value)
    }

    return result;
}

const map = (arr,fn) => {
    let results = [];

    for(const value of arr) {
        results.push(fn(value));
    }

    return results;  
}

const filter = (arr,fn) => {
    let results = [];

    for(const value of arr) {
        (fn(value)) ? results.push(value) : undefined;
    }

    return results;  
}

const reduce = (arr,fn,initialValue) => {
    let accumlator;

    if(initialValue != undefined) {
        accumlator = initialValue;
    }
    else {
        accumlator = array[0];
    } 

    for(const value of arr) {
        accumlator = fn(accumlator,value)
    }
    

  return [accumlator];
}

三、函數閉包

1.什麼是函數閉包

有權訪問另一個函數作用域鏈中的變量的函數,下例中函數inner就是閉包函數

function outer(){
    let outer = "outer";
    function inner{
       console.log(outer);                                   
    }
    return inner;
}

2.閉包的作用域鏈

  • 在它自身之內聲明的變量
  • 對全局變量的訪問
  • 對外部函數變量的訪問(重點)
function outer(){
    var result = new Array();
    for(var i = 0; i < 10; i++){
       result[i] = function(){
           return i;
       }
    }
    return result;
}

上例中result數組中的每個函數返回的都是10

四、柯里化與偏應用

1.函數柯里化

把一個多參函數轉化爲一個嵌套的一元函數的過程
function add(x,y){
    return x+y;
}
add(1,2);


// 柯里化
function curryAdd(x){
    return function(y){
        return x+y;
    }
}
curryAdd(1)(2);
const curry =(fn) => {
    if(typeof fn!=='function'){
        return;
    }
    return function curriedFn(...args){
      if(args.length < fn.length){
        return function(){
          return curriedFn.apply(null, args.concat( [].slice.call(arguments) ));
        };
      }
      return fn.apply(null, args);
    };
};

2.偏應用

const partial = function (fn,...partialArgs){
  let args = partialArgs.slice(0);
  return function(...fullArguments) {
    let arg = 0;
    for (let i = 0; i < args.length && arg < fullArguments.length; i++) {
      if (args[i] === undefined) {
        args[i] = fullArguments[arg++];
        }
      }
      return fn.apply(this, args);
  };
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章