• Javascript函数式编程


    函数式编程:通过使用函数将值转换成抽象的单元,接着用于构建软件系统(拆分再组装),也就是不断地用已有函数, 来组合出新的函数。
    面向对象编程主要目标是问题分解,函数式编程也会将一个问题分成几个函数来解决。高阶函数即以一个函数作为参数或返回一个函数作为结果
    函数式编程包涵以下技术:
    1、确定抽象,并为其构建函数
    2、利用已有的函数构建更为复杂的抽象
    3、通过将现有的函数传递给其他的函数来构建更为复杂的抽象
    UnderscoreJS是一个JavaScript实用库,提供了一整套函数式编程的实用功能,但是没有扩展任何JavaScript内置对象。“如果我在一个空白的HTML页面前坐下, 并希望立即开始工作, 我需要什么?“...它弥补了部分jQuery没有实现的功能,同时又是Backbone.js必不可少的部分。Underscore提供了100多个函数,包括常用的: map, filter, invoke ,当然还有更多专业的辅助函数,如:函数绑定, JavaScript模板功能,创建快速索引, 强类型相等测试, 等等.
    //过程风格的阶乘            
    int factorial (int n)
    {
      if (n <= 0)
        return 1;
      else
        return n * factorial (n-1);
    }

    这类语言也叫做过程性 编程语言,因为它们定义了解决问题的过程。函数式编程与这个原理有显著不同。在函数式编程中,需要描述问题 “是什么”。函数式编程语言又叫做声明性语言。同样的计算阶乘的程序可以写成所有到 n 的数字的乘积。

    //函数式风格的阶乘                    
    factorial n, where n <= 0    := 1
    factorial n    := foldr * 1 take n [1..]

    第二个语句指明要得到从 1 开始的前 n 个数字的列表(take n [1..]),然后找出它们的乘积,1 为基元。这个定义与前面的示例不同,没有循环或递归。它就像阶乘函数的算术定义。一旦了解了库函数(take 和 foldr)和标记(list notation [ ])的意义,编写代码就很容易,而且可读性也很好。

    函数式编程具有五个鲜明的特点:

    1. 函数是"第一等公民":指的是函数与其他数据类型一样,处于平等地位

    2. 只用"表达式",不用"语句"

    "表达式"(expression)是一个单纯的运算过程,总是有返回值;

    "语句"(statement)是执行某种操作,没有返回值。

    3. 没有"副作用"

    指的是函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。

    4. 不修改状态

    变量往往用来保存"状态"(state)。不修改变量,意味着状态不能保存在变量中,函数式编程使用参数保存状态

    5. 引用透明

    指的是函数的运行不依赖于外部变量或"状态",只依赖于输入的参数,任何时候只要参数相同,引用函数所得到的返回值总是相同的

     // 阶乘的一般实现  (过程式编程)
     function factorial(n) {  
       if (n == 1) {  
         return 1;  
       } else {  
         return factorial(n - 1) * n;  
       }  
     }  
       
     // 阶乘的函数式编程风格实现  
     function mul(a, b){  return a*b; }   
     function dec(x){  return x - 1; }   
     function equal(a, b){  return a==b; }      
     function factorial(n) {  
       if (equal(n, 1)) {  
         return 1;  
       } else {  
         return mul(n, factorial(dec(n)));  
       }  
    }  
  • 相关阅读:
    PyQt(Python+Qt)学习随笔:窗口的布局设置及访问
    PyQt(Python+Qt)学习随笔:QAbstractItemView的showDropIndicator属性
    PyQt学习随笔:QStandardItemModel使用注意事项
    Windows 2008 R2 防火墙允许Serv-U通过的方法
    实例化php类的时候如何传参
    密码强度检测
    php和c++socket通讯(基于字节流,二进制)
    PHP 魔术方法__set() __get() 方法详解
    type='button'和'submit'的区别
    jQuery实现CheckBox全选、全不选
  • 原文地址:https://www.cnblogs.com/chenlogin/p/6372019.html
Copyright © 2020-2023  润新知