听飞狐聊JavaScript设计模式系列03

  • A+
所属分类:JavaScript

本回内容介绍


上一回聊到JS的Object类型,简单模拟了一下Java的Map,介一讲,偶们来聊一下函数好唔好,介可系JS世界的一等公民哟。从函数开始,我们就将逐步过渡到设计模式,来吧,帅狐带你装逼带你飞:

1. 函数的定义方式有三种


(1) 函数声明:

(2) 函数表达式:

(3) 构造函数式:

这里简单的过一下函数定义,其他函数相关的基础知识还是那句:请参阅书籍或其他资料。

2. call, apply, bind


这仨都可以改变函数内部作用域的指向,bind()是ES5的新玩意儿,IE9以下不支持。call()和apply()一块儿说,这俩基友仅仅是传参不一样而已,apply传递的是数组:

再来说说bind(),在高程3(JavaScript高级程序设计第三版)书上的说法是:bind()常常和回调函数与事件处理程序一起使用以便在将函数作为变量传递的同时保留代码执行环境。后面的设计模式讲解中我们会有事件的讲解,这里我们用书上的例子来模拟bind()的实现:

这里光看例子可能有点抽象,没关系,后面讲设计模式,聊到观察者模式的时候还会聊到事件。

3. 闭包与柯里化


闭包:有权访问另一个函数作用域中变量的函数。这是书上的解释,有点懵吧,说白了,就是方法里面的方法就叫闭包。
柯里化:把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

之所以把这俩放在一起来聊,是因为这俩都不好理解,有点绕,而且柯里化依赖于闭包来实现,来吧,直接看书上的例子:

很多盆友说这个例子木有看懂,现在配上了注释,赶脚有木有好点。这里没有单独聊闭包,因为网上关于闭包的资料已经很多了。

顺便在啰嗦一句,有哥们儿面试问到了,fn.apply(null,finalArgs)这里如果是null的话,指向的是什么?答案是Global,而在浏览器环境下,Global就是window。

又是装逼时刻了,好咯,开始敲代码了:

某客面试题,正好复习函数柯里化


据说这家公司笔试题有四道题,这里先聊两道题,另外了道题后面会聊到...

1.题目:five(one(one())) 返回 511

这个例子并非柯里化的函数,因为每一次one()的返回都是一个字符串,但是对比函数柯里化,使函数柯里化的概念更直观了。

我们把这个five()改改,让他变为柯里化,让帅狐show给你看:

怎么样,帅吧!好吧,如果不帅,继续下一题,走你:

2. 题目:数组去重、并按倒数第二个字母排序

这样就完成了数组去重,下一步,按照倒数第二个字母排序:

之所以单独写第二步,因为sort()排序是按照字符编码的顺序进行排序,在传入数值的时候是有陷阱的,不会对数值大小进行排序,看例子:

这一回,主要过了一下Function类型,聊了一些函数的技巧,做了两道题,难度适中。

下一回,咱主要聊一聊,类的模拟,原型,继承,包括浅聊一下工厂模式,继续装逼继续飞。

话说最近港囧和夏洛特烦恼惹火了很多老歌,对于喜欢听老歌的我真的是大爱吖,dilililidilililidada...dilililidilililidada...

weinxin
我的微信公众号
我的微信公众号扫一扫

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: