国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript函數(shù)式編程

LeanCloud / 965人閱讀

摘要:函數(shù)式編程的特點(diǎn)函數(shù)是第一等公民,因?yàn)榻泻瘮?shù)式編程,因此函數(shù)的地位是最高的,也就是說比起變量函數(shù)的地位更高一點(diǎn)。高階函數(shù)是對(duì)其他函數(shù)進(jìn)行操作的函數(shù),可以將它們作為參數(shù)或返回它們。常見的高階函數(shù)有排序過濾

1:基本概念

函數(shù)式編程是一種編程思維方式,并不是一些語法規(guī)則,對(duì)于復(fù)用性高的功能代碼進(jìn)行一定的函數(shù)封裝,實(shí)現(xiàn)了代碼的高可復(fù)用性(主要目的)。

函數(shù)式編程的特點(diǎn):

函數(shù)是第一等公民,因?yàn)榻泻瘮?shù)式編程,因此函數(shù)的地位是最高的,也就是說比起變量函數(shù)的地位更高一點(diǎn)。

只用表達(dá)式而不用語句,表達(dá)式就是聲明式的意思,語句就是命令式的,盡量使用表達(dá)式或者是聲明式的代碼來組織邏輯。

沒有副作用的代碼,也叫做純函數(shù)或者在一些開發(fā)框架中也叫作純主鍵,純的意思是輸入一定那么輸出也一定。

不修改狀態(tài)。

引用透明。

2:函數(shù)是一等公民

理解:函數(shù)在整個(gè)JavaScript代碼里面一般來講有四種,第一種叫做聲明函數(shù)、然后是表達(dá)式函數(shù)、匿名函數(shù)以及自執(zhí)行函數(shù)。

為什么函數(shù)是一等公民?

函數(shù)聲明優(yōu)先級(jí)高于變量聲明和函數(shù)表達(dá)式

  console.log(getName);
  
  getName();
  
  var getName;
  getName = "Eric";
  function getName(){
      console.log("function getName");
  }
  
  console.log(getName);
  
  //? getName(){
      console.log("function getName");
    }
  // function getName
  // Eric

函數(shù)應(yīng)用

   //聲明函數(shù)
   function getName(){
   }
   
   //表達(dá)式函數(shù)(直接賦給一個(gè)變量)
   var getName = function(){
   }
   
   //匿名函數(shù)(沒有名字)
   setTimeout(function(){
   },1000);
   
   //自執(zhí)行函數(shù)(IIFE)
   (function(){
   })();

3:純函數(shù)

特點(diǎn):

對(duì)于相同的輸入,永遠(yuǎn)會(huì)得到相同的輸出

  function getNumber(num){
      return num + Math.random();
  }

不改變輸入值

  function getGirlGift(list){
      // 輸入值改變
      list = list.map(girl => {
          girl.gift = girl.age > 18 ? "big" : "small";
      });
      return list;
  }

不包含副作用(網(wǎng)絡(luò)、I/O)

  var array = [1,2,3,4,5];
  array.slice(0,3);
  array.slice(0,3);
  //?[1, 2, 3]
  
  // 改變?cè)瓟?shù)組
  array.splice(0,3);
  array.splice(0,3);
  //?[4, 5]
  
  //網(wǎng)絡(luò)請(qǐng)求
  asiox.get("https://www.xxxx.com").then(res => {
      
  })
  
  //時(shí)間
  function getDate(){
      return new Date();
  }

Array函數(shù)舉例

  以數(shù)組為例,純與不純函數(shù)有哪些:
  //不純:調(diào)用數(shù)組之后改變了原數(shù)組。
  array.push();       數(shù)組尾部插入
  array.pop();        刪除并返回?cái)?shù)組最后一個(gè)元素
  array.unshift();    數(shù)組頭部插入
  array.shift();      刪除并返回?cái)?shù)組第一元素
  array.splice();     刪除元素,并向數(shù)組添加元素
  array.reverse();    顛倒數(shù)組元素的順序
  array.sort();       排序數(shù)組元素
  
  
  //數(shù)組純函數(shù):調(diào)用數(shù)組的方法不改變?cè)瓟?shù)組。
  array.slice();      數(shù)組中返回選定的元素
  array.concat();     連接數(shù)組,并發(fā)揮新數(shù)組
  array.join();       按分隔符連接數(shù)組,返回字符串

4:函數(shù)柯里化

定義:傳遞給函數(shù)的一部分參數(shù)來調(diào)用它,讓它返回一個(gè)函數(shù)去處理剩下的參數(shù)。

柯里化是把接受多個(gè)參數(shù)的函數(shù)變換成接受一個(gè)單一參數(shù)(最初函數(shù)的第一個(gè)參數(shù))的函數(shù),并且返回接受余下的參數(shù)而且返回結(jié)果的新函數(shù)的技術(shù)。例如:

// 普通的add函數(shù)
function add(x, y) {
    return x + y
}
add(1,2);
// 3

// 柯里化改編后
function addX(y) {
    return function (x) {
        return x + y;
    }
}
addX(2)(1);
// 3

// 函數(shù)不純 - 硬編碼 - 依賴min參數(shù) 
var min = 90; 
var isWell = score => score > min;

// 柯里化改編 
var min = 90; 
var chekoLevel = baseLine => (score => score > baseLine);
var isWell = chekoLevel(90);
// isWell(90)
   false
// isWell(940)
   true

實(shí)際上就是把a(bǔ)dd函數(shù)的x,y兩個(gè)參數(shù)變成了先用一個(gè)函數(shù)接收x然后返回一個(gè)函數(shù)去處理y參數(shù)。現(xiàn)在思路應(yīng)該就比較清晰了,就是只傳遞給函數(shù)一部分參數(shù)來調(diào)用它,讓它返回一個(gè)函數(shù)去處理剩下的參數(shù)。

一種對(duì)參數(shù)的緩存

用在一些區(qū)分環(huán)境的函數(shù)預(yù)緩存

已獲取某些耗時(shí)操作結(jié)果緩存

5:函數(shù)組合

在函數(shù)式編程思想之前,出現(xiàn)過一個(gè)函數(shù)嵌套的現(xiàn)象,函數(shù)嵌套是一個(gè)函數(shù)的執(zhí)行結(jié)果它是另外一個(gè)函數(shù)的入?yún)ⅲ话銇碇v是兩層,但是兩層以上或者更多也是可能的。比如下面的代碼,它的意思是function13的結(jié)果作為function2的入?yún)ⅲ缓骹unction2的結(jié)果又作為function1的入?yún)ⅰ_@樣的寫法不太好理解而且容易混亂,因此在這個(gè)基礎(chǔ)上,衍生了函數(shù)式編程的另外一個(gè)思想,叫做函數(shù)組合。

函數(shù)組合是通過另外一個(gè)函數(shù)去組合嵌套函數(shù),但是函數(shù)本身的嵌套關(guān)系,依賴關(guān)系是不會(huì)改變的。只不過是通過另外一個(gè)函數(shù)完成一個(gè)組裝。

函數(shù)嵌套

  function1(function2(function13(x)));

函數(shù)組合

  var compose = (function1, function2) => (x => function1(function2(x)));
  
  var function1 = param => param + 1;
  var function2 = param => param + 2;
  var final = compose(function1, function2);
  final(1);
  
  // 4

6:Point Free

不要命名轉(zhuǎn)瞬即逝的中間變量。

var getSplitWord = str => str.toUpperCase().split(" ");

//柯里化封裝
var toUpperCase = word => word.toUpperCase();
var split = x => str => str.split(x);
var getSplitWord = compose(split(" "), toUpperCase);
7:聲明式代碼
var students = [{
    name: "Eric",
    score: 99,
    },
    {
        name: "Iven",
        score: 59,
    }
}];

//命令式
const getWell =students => {
    let result = [];
    for (let i = 0; i < students.length; i++){
        if (students[i].score >= 90){
            result.push(students[i])
        }
    }
    return result;
}

//聲明式
const getWell = students => return students.filler(student => students.score >= 90);
8:高階函數(shù)

把函數(shù)當(dāng)參數(shù),把傳入的函數(shù)做一個(gè)封裝。

function add(x,y,f){
    return f(x) + f(y);
}

高階函數(shù)是對(duì)其他函數(shù)進(jìn)行操作的函數(shù),可以將它們作為參數(shù)或返回它們。 簡單來說,高階函數(shù)是一個(gè)函數(shù),它接收函數(shù)作為參數(shù)或?qū)⒑瘮?shù)作為輸出返回。

常見的高階函數(shù)有:

Array.map

  var array = [1,2,3];
  array.map(s => s + 1);
  // [2, 3, 4]

Array.sort(排序)

Array.filter(過濾)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/106011.html

相關(guān)文章

  • SegmentFault 技術(shù)周刊 Vol.16 - 淺入淺出 JavaScript 函數(shù)編程

    摘要:函數(shù)式編程,一看這個(gè)詞,簡直就是學(xué)院派的典范。所以這期周刊,我們就重點(diǎn)引入的函數(shù)式編程,淺入淺出,一窺函數(shù)式編程的思想,可能讓你對(duì)編程語言的理解更加融會(huì)貫通一些。但從根本上來說,函數(shù)式編程就是關(guān)于如使用通用的可復(fù)用函數(shù)進(jìn)行組合編程。 showImg(https://segmentfault.com/img/bVGQuc); 函數(shù)式編程(Functional Programming),一...

    csRyan 評(píng)論0 收藏0
  • 翻譯連載 | 附錄 C:函數(shù)編程函數(shù)庫-《JavaScript輕量級(jí)函數(shù)編程》 |《你不知道的J

    摘要:為了盡可能提升互通性,已經(jīng)成為函數(shù)式編程庫遵循的實(shí)際標(biāo)準(zhǔn)。與輕量級(jí)函數(shù)式編程的概念相反,它以火力全開的姿態(tài)進(jìn)軍的函數(shù)式編程世界。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個(gè)流淌著滬江血液的純粹工程:認(rèn)真,是 HTML 最堅(jiān)實(shí)的梁柱;分享,是 CSS 里最閃耀的一瞥;總結(jié),...

    Miracle 評(píng)論0 收藏0
  • 每個(gè) JavaScript 工程師都應(yīng)當(dāng)知道的 10 個(gè)面試題

    摘要:所支持的面向?qū)ο缶幊贪ㄔ屠^承。發(fā)明于年的就是首批支持函數(shù)式編程的語言之一,而演算則可以說是孕育了這門語言。即使在今天,這個(gè)家族的編程語言應(yīng)用范圍依然很廣。 1. 能說出來兩種對(duì)于 JavaScript 工程師很重要的編程范式么? JavaScript 是一門多范式(multi-paradigm)的編程語言,它既支持命令式(imperative)/面向過程(procedural)編程...

    jone5679 評(píng)論0 收藏0
  • 每個(gè) JavaScript 工程師都應(yīng)當(dāng)知道的 10 個(gè)面試題

    摘要:所支持的面向?qū)ο缶幊贪ㄔ屠^承。發(fā)明于年的就是首批支持函數(shù)式編程的語言之一,而演算則可以說是孕育了這門語言。即使在今天,這個(gè)家族的編程語言應(yīng)用范圍依然很廣。 1. 能說出來兩種對(duì)于 JavaScript 工程師很重要的編程范式么? JavaScript 是一門多范式(multi-paradigm)的編程語言,它既支持命令式(imperative)/面向過程(procedural)編程...

    YorkChen 評(píng)論0 收藏0
  • 每個(gè) JavaScript 工程師都應(yīng)當(dāng)知道的 10 個(gè)面試題

    摘要:所支持的面向?qū)ο缶幊贪ㄔ屠^承。發(fā)明于年的就是首批支持函數(shù)式編程的語言之一,而演算則可以說是孕育了這門語言。即使在今天,這個(gè)家族的編程語言應(yīng)用范圍依然很廣。 1. 能說出來兩種對(duì)于 JavaScript 工程師很重要的編程范式么? JavaScript 是一門多范式(multi-paradigm)的編程語言,它既支持命令式(imperative)/面向過程(procedural)編程...

    Gilbertat 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<