博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js函数式编程
阅读量:5257 次
发布时间:2019-06-14

本文共 3625 字,大约阅读时间需要 12 分钟。

  js 函数式编程

    定义把函数作为第一类对象是函数式编程的第一步,函数式编程是一种编码风格,他通过书写函数式代码来解决问题(而不是一系列执行步骤,就像

    就像那种更主流的命令式编程),函数式编程可以让代码更容易测试、扩展、及模块化

    1.函数是javascript中的一等公民,(主要是的某个变量可以等于一个函数,然后是用变量名加()去调用这个函数)

      1.1构造函数

      1.2普通函数

    1.1函数作为构造函数使用,一般构造函数的首字母大写,做为构造函数使用,我们就可以使用new去创建那个实力

function Person() {    this.name = 'cz';    this.age = 19;    this.sex = '男';    this.fn = function (val) {        console.log(val)    }}let p1 = new Person();console.log(p1.name,p1.age,p1.sex)p1.fn('a')

    1.2 作为普通函数调用,这个就是最简单的使用

function speak(val) {    console.log(val+'wawawahahha');}speak('duide')

    

  2几种常见的函数使用

    2.1 函数作为变量的使用(回调函数,)

function goback(a,b,callback) {    let c = a + b;    callback(c)}function cc(last) {    console.log(last)}goback(1,2,cc);

    /* 手动实现数组的排序功能 */

Array.prototype.zdysort = function (fn) {    let len = this.length;    for(let i = 0;i < len; i++) {        for(let j = i+1;j < len; j++) {            let temp = this[i]            if(fn(this[i],this[j])) {                this[i] = this [j]                this[j] = temp            }        }    }}/* 升序 */function sort(a,b) {    return a>b}let arrys = [1,25,3,6,7,9,45,21,35,62,54,21]arrys.zdysort(sort)console.log(arrys)function usort(a,b) {    return a

    2.2函数柯里化

      维基百科上说道:柯里化,英语:Currying(果然是满满的英译中的既视感),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术

    

/* 函数科里化 *//* 一个简单的函数柯里化 */function add (a,b) {    return a+b;}function kadd(a) {    return function (b) {        return a+b    }}console.log(add(1,2)) // 3console.log(kadd(1)(2))  // 3/* 柯里化 实现函数参数的复用 */function Istype (type) {    return function (obj) {        return typeof(obj) === type    }}let Isnumber = Istype('number')console.log(Isnumber(1))console.log(Isnumber('a'))console.log(Isnumber(4))let isobject = Istype('object')console.log(isobject({}))console.log(isobject('a'))console.log(isobject(4))
/* 使用函数柯里化实现 函数的bind */Function.prototype.zdybind = function (content) {    let self = this    return function () {        return self.call(content,arguments)    }}function Animal(){        this.name = "Animal";        this.showName = function(){            console.log(this.name);        }    } // Animal.showName();// 报错 animal is not a functionlet a1 = new Animal();a1.showName() // "Animal"a1.showName.call({name:'czcz'}) //czcz/* 使用自定义的bing函数 */a1.showName.zdybind({name:'czcz'}) // 输出无/* bind 相对于 call和apply 需要自己手动调用 */a1.showName.zdybind({name:'czcz'})() //'czcz'  自定义的zdybind函数就实现了

  函数,不得不提的就是函数上原生就有的三个方法,bind,call,apply,他们都能改变函数的执行作用域(运行时的函数this指向)

  call 和 apply 基本上一样,就是传入的第二参数不一样,一个传入的参数用,call(self,a,b,c,d) bind(self,[a,b,c,d]) ,而bind和他们的区别就是bind创建后不会立即执行,上面已经实现

 

   函数式编程远远都不止这么一点,上面只是一些平常会经常遇见的问题,函数运行时的执行环境也是非常重要的。直接调用,作为构造函数调用,箭头函数,apply bing,call,之后的函数作用域

  ,es6 还对函数新增的一些扩展

  3.es6函数的扩展 

    3.1 函数的默认参数问题

function speak(name = 'cz') {    console.log(`${name} i love you`)}speak()speak('czkjjj')

    3.2参数的解构赋值

    3.3 rest 参数,直接将argument直接转化成数组

    3.4name 和length属性, name 代表函数名字, length 代表函数的参数 length 长度不包括rest 参数

    3.5 es6函数最重要的扩展,箭头函数,(没有自身this的函数,只想上一级不为箭头函数的函数)

/* es6箭头函数 *//* 数组排序是箭头函数的使用 */let arrys = [25,1,34,5,64,15,3,1,7,84,65]let newarrys = arrys.sort(function(a,b){    return a - b})console.log(newarrys)
/* setTimeout 中的this指向  函数体内的this对象,就是定义时所在的对象 ,而不是运行时的this*/let obj = {    a: 'czcz',    b: 'dddd',    c: function () {        setTimeout (function () {            console.log(this.a)        },0)    }}obj.c(); // 输出undefined 这里内部的函数最终的执行环境 window/* 改造一下函数 */obj.d = function () {    setTimeout(()=>    {        console.log(this.a)    },0)}obj.d() // 输出'czcz' 这里内部的函数最终的执行环境 obj

 

转载于:https://www.cnblogs.com/czkolve/p/10779554.html

你可能感兴趣的文章
多线程实现资源共享的问题学习与总结
查看>>
Learning-Python【26】:反射及内置方法
查看>>
torch教程[1]用numpy实现三层全连接神经网络
查看>>
java实现哈弗曼树
查看>>
转:Web 测试的创作与调试技术
查看>>
python学习笔记3-列表
查看>>
程序的静态链接,动态链接和装载 (补充)
查看>>
关于本博客说明
查看>>
线程androidAndroid ConditionVariable的用法
查看>>
转载:ASP.NET Core 在 JSON 文件中配置依赖注入
查看>>
socket初识
查看>>
磁盘测试工具
查看>>
代码变量、函数命名神奇网站
查看>>
redis cli命令
查看>>
Problem B: 占点游戏
查看>>
python常用模块之sys, os, random
查看>>
HDU 2548 A strange lift
查看>>
Linux服务器在外地,如何用eclipse连接hdfs
查看>>
react双组件传值和传参
查看>>
[Kaggle] Sentiment Analysis on Movie Reviews
查看>>