Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JavaScript高阶函数

JavaScript高阶函数

作者头像
薛定喵君
发布于 2019-11-05 17:06:47
发布于 2019-11-05 17:06:47
46700
代码可运行
举报
文章被收录于专栏:薛定喵君薛定喵君
运行总次数:0
代码可运行

至少满足下列条件之一的函数

  • 可以作为参数被传递
  • 可以作为返回值输出

应用场景

作为参数传递

回调函数

ajax 异步请求完成之后执行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var getUserInfo = function( userId, callback ){
   $.ajax( 'http://xxx.com/getUserInfo?' + userId, function( data ){
       if ( typeof callback === 'function' ){
           callback(data);
       }
   });
}
getUserInfo( 13157, function( data ){
   console.log(data.userName);
});
Array.prototype.sort
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//从小到大排列
[ 1, 4, 3 ].sort( function( a, b ){
   return a - b;
});
// 输出: [ 1, 3, 4 ]

//从大到小排列
[ 1, 4, 3 ].sort( function( a, b ){
   return b - a;
});
// 输出: [ 4, 3, 1 ]

作为返回值输出

判断数据的类型
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var Type = {};
for (var i = 0, type; type = ['String', 'Number', 'Boolean', 'Object'][i++];) {
   (function(type) {
       Type["is" + type] = function(o) {
           return Object.prototype.toString.call(o) === '[object ' + type + ']';
       }
   })(type);
}

console.log(Type.isString("hh"));
getSingle

单例模式的例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var getSingle = function ( fn ) {
   var ret;
   return function () {
       return ret || ( ret = fn.apply( this, arguments ) );
   };
};
//效果
var getScript = getSingle(function(){
`return document.createElement( 'script' );
});
var script1 = getScript();
var script2 = getScript();
alert ( script1 === script2 ); // 输出: true
实现AOP

把一些跟核心业务逻辑模块无关的功能抽离出来,这些跟业务逻辑无关的功能通常包括日志统计、安全控制、异常处理等 可以保持业务逻辑模块的纯净和高内聚性

在 JavaScript中实现 AOP,都是指把一个函数“动态植入”到另外一个函数之中,例如扩展 Function.prototype

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Function.prototype.before = function(beforeFn) {
    var self = this;
    return function() {
        beforeFn.apply(this, Array.prototype.slice.call(arguments));
        return self.apply(this, Array.prototype.slice.call(arguments));
    }
};

Function.prototype.after = function(afterFn) {
    var self = this;
    return function() {
        var ret;
        ret = self.apply(this, Array.prototype.slice.call(arguments));
        afterFn.apply(this, Array.prototype.slice.call(arguments));
        return ret;
    }
}

var func = function() {
    console.log(2);
}
func = func.before(function() {
    console.log(1);
}).after(function() {
    console.log(3);
})
func();//1 2 3
柯里化

currying又称部分求值。一个currying的函数首先会接受一些参数,接受了这些参数之后,该函数并不会立即求值,而是继续返回另外一个函数,刚才传入的参数在函数形成的闭包中被保存起来。待到函数被真正需要求值的时候,之前传入的所有参数都会被一次性用于求值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var curry = (function() {
    var data = [1];
    var func = function(n) {
        data.push(n);
        return func;
    }
    func.valueOf = function() {
        var ret = data.reduce(function(a, b) {
            return a * b;
        })
        data = [1];
        return ret;
    }
    return func;
})();

console.log(curry(1));
console.log(curry(1)(2));
console.log(curry(1)(2)(3));

专门定义一个函数,对上面解法的参数进行柯里化⬇️

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var curry = function(fn) {
    var args = [];
    var ret = function(n) {
        args.push(n);
        return ret;
    }

    ret.valueOf = function() {
        var ret = args.reduce(fn);
        args = [];
        return ret;
    }
    return ret;
}

var func = curry(function(a, b) {
    return a * b;
})

console.log(func(1));
console.log(func(1)(2));
console.log(func(1)(2)(3));
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/07/14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JavaScript设计模式与开发实践 - 高阶函数的应用
定义 高阶函数是指至少满足下列条件之一的函数: 函数可以作为参数被传递; 函数可以作为返回值输出。 JavaScript语言中的函数显然满足高阶函数的条件,在实际开发中,无论是将函数当作参数传递,还是让函数的执行结果返回另外一个函数,这两种情形都有很多应用场景,以下就是一些高阶函数的应用。 应用 作为参数传递 ajax异步请求 // callback为待传入的回调函数 var getUserInfo = function(userId, callback) { $.ajax("http://xxx
laixiangran
2018/04/11
9050
从闭包和高阶函数初探JS设计模式
JavaScript是一门完整的面向对象的编程语言,JavaScript在设计之初参考并引入了Lambda表达式、闭包和高阶函数等特性。
小东同学
2022/07/29
5460
从闭包和高阶函数初探JS设计模式
【JS】530- 一文看懂高阶函数
高阶函数 函数可以作为参数传递 函数可以作为返回值输出 函数作为参数传递 回调函数 在ajax异步请求的过程中,回调函数使用的非常频繁 在不确定请求返回的时间时,将callback回调函数当成参数传入
pingan8787
2020/03/19
7220
【JS】530- 一文看懂高阶函数
JavaScript-设计模式·基础知识
《JavaScript 设计模式与开发实践》是去年在多看阅读上买的电子书,拖延症晚期患者在快一年后终于把这本书粗略读完,顺便做个笔记,加以总结,以便往后重新翻阅温习。
数媒派
2022/12/01
4400
JavaScript 设计模式学习第三篇- 闭包与高阶函数
JavaScript 的函数也是对象,可以有属性,可以赋值给一个变量,可以放在数组里作为元素,可以作为其他对象的属性,什么都可以做,别的对象能做的它能做,别的对象不能做的它也能做,这不就是一等公民的地位嘛。 — 程墨 Morgan
越陌度阡
2020/11/26
3570
基于装饰器——我劝你不要在业务代码上装逼!!!
沉浸式趣谈
2024/03/13
1220
基于装饰器——我劝你不要在业务代码上装逼!!!
JavaScript高级技巧
以上代码要返回true,value必须是一个数组,而且还必须与Array构造函数在同个全局作用域中。(Array是window的属性)如果value是在另外一个iframe中定义的数组,上述代码则返回false。 注意:BOM的核心对象时window,它表示浏览器的一个实例。在浏览器中,window对象有双重角色,它既是通过JavaScript访问浏览器窗口的一个接口,又是ECMAScript规定的global对象。 解决上述问题: Object原生的toString()方法,都会返回一个[object NativeConstructorName]格式的字符串。
奋飛
2019/08/15
1.1K0
JavaScript设计模式--装饰者模式
有时我们不希望某个类天生就非常庞大,一次性包含许多职责。那么我们就可以使用装饰着模式。 装饰着模式可以动态地给某个对象添加一些额外的职责,从而不影响这个类中派生的其他对象。 装饰着模式将一个对象嵌入另一个对象之中,实际上相当于这个对象被另一个对象包装起来,形成一条包装链。
奋飛
2019/08/15
4190
javascript设计模式十:装饰者模式
在js函数开发中,想要为现有函数添加与现有功能无关的新功能时,按普通思路肯定是在现有函数中添加新功能的代码。这并不能说错,但因为函数中的这两块代码其实并无关联,后期维护成本会明显增大,也会造成函数臃肿。
前端_AWhile
2019/08/29
4450
理解运用JS的闭包、高阶函数、柯里化
JS的闭包,是一个谈论得比较多的话题了,不过细细想来,有些人还是理不清闭包的概念定义以及相关的特性。
书童小二
2018/09/03
1.6K1
理解运用JS的闭包、高阶函数、柯里化
无敌秘籍之 — JavaScript手写代码
用来解析JSON字符串,构造由字符串描述的JavaScript值或对象。提供可选的reviver函数用以在返回之前对所得到的对象执行变换(操作)。
小生方勤
2019/07/15
4260
无敌秘籍之 — JavaScript手写代码
JavaScript设计模式--前奏
设计模式应遵守的原则: (1)最少知识原则:一个软件实体应当尽可能少地与其他实体发生相互作用(把对象划分成较小的粒度,以便提高复用性) (2)开放-封闭原则:软件实体(类、模块、函数)等应该是可以扩展的,但是不可修改。
奋飛
2019/08/15
3940
JS函数hook
我在阅读《JavaScript 设计模式与开发实践》的第 15 章 装饰者模式,突然发现 JS 逆向中 hook 函数和 js 中的装饰者模式有点像,仔细阅读完全篇后更是对装饰器与 hook 有了更深的理解于是便有了这篇文章来记录一下该操作。
愧怍
2022/12/27
3.7K0
【说站】js装饰者模式是什么
在程序开发中,不希望某种类型天生庞大,一次承担很多责任,可以使用装饰者模型。装饰者的模式可以动态地给某个对象追加责任,不会影响从这个类中诞生其他对象。
很酷的站长
2022/11/24
4260
【说站】js装饰者模式是什么
手撕常见JS面试题
高阶函数实现AOP(面向切面编程) Function.prototype.before = function (beforefn) { let _self = this; // 缓存原函数的引用 returnfunction () { // 代理函数 beforefn.apply(this, arguments); // 执行前置函数 return _self.apply(this, arguments); // 执行原函数
helloworld1024
2022/10/14
5410
几种常用设计模式的简单示例
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
编程三昧
2021/08/21
5890
几种常用设计模式的简单示例
深入理解JavaScript系列(49):Function模式(上篇)
本篇主要是介绍Function方面使用的一些技巧(上篇),利用Function特性可以编写出很多非常有意思的代码,本篇主要包括:回调模式、配置对象、返回函数、分布程序、柯里化(Currying)。
用户4962466
2019/12/16
3710
《JavaScript函数式编程指南》读书笔记
老规矩,这篇文章记录书中的重点部分,外加自己的见解,不会对全书进行复述,但记录的绝对是最重要的部分,想要了解跟多内容请看原版图书。
kai666666
2020/10/19
1K0
《JavaScript函数式编程指南》读书笔记
编写高质量代码:改善JavaScript程序建议--函数式编程
使用call和apply方法可以把一个函数转换为方法传递给某个对象。这种行为只是临时的,函数最终并没有作为对象的方法而存在,当函数被调用后,该对象方法会自动被注销。
奋飛
2019/08/15
4050
前端必知道的几个 JavaScript 高级函数
高阶函数是对其他函数进行操作的函数,可以将它们作为参数或通过返回它们。简单来说,高阶函数是一个函数,它接收函数作为参数或将函数作为输出返回。
夜尽天明
2023/03/15
4030
前端必知道的几个 JavaScript 高级函数
相关推荐
JavaScript设计模式与开发实践 - 高阶函数的应用
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验