JavaScript进阶设计模式系列——基础篇——高阶函数
来源:互联网 发布:复印件制作软件 编辑:程序博客网 时间:2024/05/22 07:04
定义:
是指满足下列条件之一的函数:
- 函数可作为参数被传递
- 函数可作为返回值输出
详情参见维基百科定义:
应用场景
作为参数传递
回调函数
其实,从本质上来讲:回调函数和委托是一回事儿。当一个函数不适合执行一些请求的时候,我们把这些请求封装成一个函数,并把它作为参数传递给另外一个函数,委托其他的函数来执行。
在Ajax的使用过程中,回调函数使用非常频繁。我们想要在Ajax请求完成后,执行一些操作,但是有不知道返回的确切时间,最常见的方案就是把callback函数当做参数传入发起Ajax请求的方法中,在请求完成之后,执行callback函数。
作为返回值输出
让函数继续返回一个可执行的函数,这样运算过程就被延续了。
实例演示:
var getSingle = function (fn) { var ret ;//由于使用了闭包,第二次访问的时候,ret保留了上一次的值 return function () { return ret || (ret = fn.apply(this,arguments)); };};var getScript = getSingle(function () { return { name : 'script' }});var script1 = getScript();var script2 = getScript();console.log(script1 === script2); //输出true
实现AOP
/** * Created by bill on 7/4/2017. */Function.prototype.before = function (beforefn) { var _self = this; //保留对原函数的引用 return function () { beforefn.apply(this,arguments);//改变this 的指向,调用before函数 _self.apply(this,arguments); //调用原函数 }}Function.prototype.after = function (afterfn) { var _self = this; return function () { var ret = _self.apply(this,arguments); afterfn.apply(this,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),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术
它还可以称之为部分求值。
函数UNcurrying(反柯里化)
函数节流
分时函数
惰性加载函数
后话:其他应用,大家有兴趣的自行研究下吧,就不一一和大家介绍了。
阅读全文
0 0
- JavaScript进阶设计模式系列——基础篇——高阶函数
- JavaScript进阶设计模式系列——基础篇——this-call-apply
- JavaScript进阶设计模式系列——基础篇——闭包(1)--闭包和作用域
- JavaScript进阶设计模式系列——基础篇——闭包(2)--闭包和生命周期
- JavaScript进阶设计模式系列——基础篇——闭包(3)--闭包的作用
- JavaScript进阶设计模式系列——基础篇——闭包(4)--闭包和面向对象的设计
- JavaScript进阶设计模式系列——基础篇——闭包(5)--命令模式的两种实现方式
- 《javascript设计模式与开发实践》阅读笔记(五)——高阶函数
- JavaScript设计模式--高阶函数
- JavaScript设计模式——构造函数模式
- 软件工程师进阶系列——万变不离其宗(设计模式下午题大盘点)
- JavaScript进阶学习——函数
- [Scala函数特性系列]——高阶函数
- Linq系列—设计模式
- Javascript 设计模式——1.3 函数是一等对象
- JavaScript面向对象设计二——构造函数模式
- Python基础进阶篇——函数式编程
- Javascript 设计模式——1.6 JavaScript中的设计模式
- Unity3D 02-基类MonoBehaviour/自带函数以及脚本执行的生命周期
- 工业大数据漫谈19:工业大数据数据采集常见的工业协议简介(下)
- string的replace函数,不能替换有特殊字符的字符串(如{等),怎么办?自己拼接呗
- yii中使用ajax报500错误
- C++ Cstring 转 const * char (Unicode 及非Unicode)
- JavaScript进阶设计模式系列——基础篇——高阶函数
- HTTP协议
- bug宝典Python篇 WindowsError: [Error 32] Logged from file remote_connection.py
- TRUNCATE的用法,以及与delete的对比
- jQuery验证控件jquery.validate.js使用说明+中文API
- 监控指定进程
- Zeppelin执行SparkSQL长时间无响应
- 如何停止Handler的消息队列
- 通过base64字符串之间的编码解码实现图片上传