说来惭愧,4个多月未更新了。4月份以后就开始忙起来了,论文、毕设、毕业旅行等七七八八的事情占据了很多时间,毕业之后开始忙碌的工作,这期间一直想写博客,但是一直没能静下心写。这段时间在看《JavaScript设计模式与开发实践》,感觉很不错,受益匪浅。

  这篇文章将围绕高阶函数是什么、高阶函数有什么作用等几个方面来进行介绍。

  什么是高阶函数?

  高阶函数是指至少满足下列条件之一的函数:

  1.函数可以作为参数被传递

  2.函数可以作为返回值输出

  

  1.函数作为参数传递,这样我们可以抽离出一部分容易变化的业务逻辑,把这部分业务放在函数参数中,这样一来就可以分离业务代码中变化与不变的部分。常见的形式有:

  1)回调函数

  常见的回调如ajax中:当我们使用ajax发出请求,但是不知道请求返回的确切时间,我们可以使用回调来解决,将callback当作参数传入ajax请求的方法中,等请求完成后执行。

function getData(id, callback){
$.ajax({
type: 'GET',
url: 'http://163.com/?getData='+id,
dataType: 'json',
success: function(data){
callback(data);
}
})
} getData(12345, function(data){console.log(data)})

  回调函数不仅可以使用在异步请求中:

  假如我们想在页面中创建一百个div节点,同时将这些节点都设置为隐藏,可以这么实现

function appendDiv(){
for(var i = 0; i < 100; i++){
var div = document.createElement('div');
div.innerHTML = i;
document.body.append(div);
div.style.display = 'none';
}
}
appendDiv()

  这样写看似没有问题,但是当我们下次修改需求,将100个div改变背景颜色,这段代码就难以复用了。我们可以这样:

function appendDiv(callback){
for(var i = 0; i < 100; i++){
var div = document.createElement('div');
div.innerHTML = i;
document.body.append(div);
if(callback && typeof callback === 'function'){
callback(div)
}
}
}
appendDiv(function(node){
node.style.display = 'none'
})

  通过使用回调,将业务代码将在回调函数中,可以抽离出一部分业务代码,对代码复用有很大的帮助。如果后期需要修改需求,改变颜色,改变大小等等只需要重新写回调函数即可。

  2)Array.prototype.sort,该方法接受一个函数作为参数,这个函数告诉Array的排序规则,通过定义不同的方法实现不同的排序,使得sort非常灵活。

[1, 3, 4, 2].sort(function(a, b){
return a-b;
})
//输出[1, 2, 3, 4] [1, 3, 4, 2].sort(function(a, b){
return b-a;
})
//输出[4, 3, 2, 1]

  2.函数作为返回值输出

  1)判断数据的类型

  如之前的文章 http://www.cnblogs.com/ppforever/p/4362102.html 判断一个js对象是不是数组,将函数作为返回值。稍加扩展:

var isType = function(type){
//函数作为返回值
return function(obj){
return Object.prototype.toString.call(obj) === '[object '+ type +']';
}
}
var isArray = isType('Array');
var isString = isType('String');
var isNumber = isType('Number'); console.log(isArray([1, 6, 3]))
//true

我们也可以使用循环语句,批量注册isType方法:

var Type = {};

for(var i = 0, type; type = ['String', 'Array', 'Number'][i++]; ){
(function(type){
Type['is'+type] = function(obj){
        
return Object.prototype.toString.call(obj) === '[object '+ type +']';
}
})(type)
} Type.isArray([]);
//true
Type.isString('abc');
//true
Type.isNumber(123);
//true
Type.isArray(123);
//false

  上部分主要介绍高阶函数的常见形式,下部分将着重介绍高阶函数的高级应用。

  

   

JavaScript设计模式与开发实践——读书笔记1.高阶函数(上)的更多相关文章

  1. JavaScript设计模式与开发实践——读书笔记1.高阶函数(下)

    上部分主要介绍高阶函数的常见形式,本部分将着重介绍高阶函数的高级应用. 1.currying currying指的是函数柯里化,又称部分求值.一个currying的函数会先接受一些参数,但不立即求值, ...

  2. Javascript设计模式与开发实践读书笔记(1-3章)

    第一章 面向对象的Javascript 1.1 多态在面向对象设计中的应用   多态最根本好处在于,你不必询问对象“你是什么类型”而后根据得到的答案调用对象的某个行为--你只管调用行为就好,剩下的一切 ...

  3. javascript设计模式与开发实践阅读笔记(6)——代理模式

    代理模式:是为一个对象提供一个代用品或占位符,以便控制对它的访问. 代理模式的关键是,当客户不方便直接访问一个对象或者不满足需要的时候,提供一个替身对象来控制对这个对象的访问,客户实际上访问的是替身对 ...

  4. javascript设计模式与开发实践阅读笔记(5)——策略模式

    策略模式:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换. 我的理解就是把各种方法封装成函数,同时存在一个可以调用这些方法的公共函数.这样做的好处是可以消化掉内部的分支判断,使代码效率 ...

  5. javascript设计模式与开发实践阅读笔记(8)——观察者模式

    发布-订阅模式,也叫观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知. 在JavaScript开发中,我们一般用事件模型来替代传统的观察者模式. ...

  6. javascript设计模式与开发实践阅读笔记(7)——迭代器模式

    迭代器模式:指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示. 迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺 ...

  7. javascript设计模式与开发实践阅读笔记(4)——单例模式

    定义 单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 具体来说,就是保证有些对象有且只有一个,比如线程池.全局缓存.浏览器中的window 对象等.在js中单例模式用途很广,比如登录 ...

  8. 《JavaScript设计模式与开发实践》笔记第八章 发布-订阅模式

    第八章 发布-订阅模式 发布-订阅模式描述 发布-订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知. 发布-订阅模式可以广泛应用于 ...

  9. 《JavaScript设计模式与开发实践》笔记第一章

    第一章 面向对象的JavaScript 动态类型语言和鸭子类型 编程语言按照数据类型大体可以分为两类:静态类型语言.动态类型语言. 静态类型语言:在编译时便已确定变量的类型. 优点: 在编译时就能发现 ...

随机推荐

  1. koa源码阅读[0]

    koa源码阅读[0] Node.js也是写了两三年的时间了,刚开始学习Node的时候,hello world就是创建一个HttpServer,后来在工作中也是经历过Express.Koa1.x.Koa ...

  2. var_dump打印出来格式太乱 怎么调

    var_dump()和print_r() 输出的都是文本格式,在浏览器中就是这样如果你加载了 xdebug 扩展,那么 var_dump() 就会以 html 格式输出

  3. [转载]PM管理技巧

      产品经理的沟通策略 2016年10月11日/分类: 文章 /编辑: Amy 产品经理处于沟通枢纽的位置,工作中需要跟各种岗位的人打交道,比如:领导.开发.运营.客户.用户.合作伙伴… 沟通能力是产 ...

  4. fastJson去掉指定字段

    public static String filterFieldsJson(Object src, Class<?> clazz, String... args) { SimpleProp ...

  5. HTML+CSS图文排版

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  6. python实现IMAP协议下email收取

    本文为转载,原文在这里. 所谓无痕取信,目前主要是指从邮箱中把信件收取后,邮箱内状态不发生任何改变.这里的状态主要是指两部分,一部分是邮件状态不变,即已读与未读状态不变,另一部分是指邮箱记录的登陆IP ...

  7. MySql学习笔记——触发器

    今天又学习了一下mysql触发器的相关知识,对此做了一些笔记和总结. 定义及作用 触发器是一个被指定关联到一个表的数据对象,触发器不需要调用,当对一个表的特别事件出现时,它就会被激活.触发器的代码也是 ...

  8. WP主题模板制作修改教程

    WP主题模板制作修改教程 实际上,当我们打开某个主题的文件夹时,看到的并不止这两个文件,而是更多.但一般来说,在一个完整的 WP 主题文件夹中都应该包含下列文件(也称为模板文件):页面 模板文件 用途 ...

  9. MINIBASE源代码阅读笔记之buffer manager

    BufDesc frame 们的 descriptor(见BufHashTbl注释),包括 pageNo: 这个 frame 在文件里的id,page number prevframe: -1 表示此 ...

  10. [BZOJ4945][Noi2017]游戏 2-sat

    对于所有的x,我们枚举他的地图类型,事实上我们只需要枚举前两种地形就可以覆盖所有的情况. 之后就变成了裸的2-sat问题. 对于一个限制,我们分类讨论: 1.h[u]不可选,跳过 2.h[v]不可选, ...