00:00
也是一个特别重要的概念,叫B包啊,B包,B包同学们在学Java的时候,老师应该讲过对吧?啊,可能忘了,如果Java没有讲过的话,那个JS应该讲啊,你们没学JS学过JS吗?你们就是javascript啊,有些同学可能学过,他们班好多做开发的是知道的,那你做前端,我们曾经有句话,前端开发人员水平高低取决于什么呢?不取决于你这个HTM5写的怎么样,你的这个这个一叉T或者结块用怎么样,最牛逼的就是JS,因为所有的框架的底层全是JS写的,知道吧,那个JS能写好的人是是很厉害的啊,他可以把那个浏览器玩转。啊,甚至JS写的好的人,像全low的JS,那简直跟玩似的啊,JS其实是前端人员的一个核心,如果是做前端开发的人,他的JS水平的高低直接取直接决定他的薪水的高低,就跟我们学大数据的,你的什么高,你的哪个学的好,决定你你的薪资呢,说说的根具体第一个是你的应用,就你的应用能力怎么强,第二个再往深的时候就是算法啊,那那个前端人员,因为他们一般不搞算法,所以JS是他的核心,只要JS学好的人,他学框架,什么j query,什么E叉T是吧,Load的JS,呃,这些小玩意,还有安格拉那个玩玩似的啊,那个玩似的,当然很多同学也学不好这个很郁闷,就这个不好学啊,不好学好,我们看一下B包吧,啊,B包在解S里面就有一个很重要概概念B包,B包在几乎在所有语言里面都有,都会有这个概念。
01:35
啊,包括像PHP啊,啊,这个购物语言都会出现B包,那这个B包是一种语法的现象啊,不是哪个语言单有的,那么B包我们来看看是什么玩意呢?首先听这个名字啊,B包它有个专业的术语,这个英文叫closer。CCS,是啊,这个cure。
02:01
Closer啊,B包,那么这个B包是什么意思呢?啊,它是这样子的,B包就是一个函数,首先这个B包跟函数有关系。哎,跟函数关系,那么这个函数干什么呢?这个函数与它引用的一个环境,与它相关的一个引用环境组合了一个整体。也就是说你这个函数本身用到了函数外的一个变量,而这个变量跟函数呢,形成了一个整体包裹在一起了,有点类似于我们的对象实力,跟对象有点类似于,这种感觉有点类似于对象的方法跟对象的属性的关系。哎,就有点类似一个东西。其实在很多语言里面,必包的本质就是一个对象,所以很多人讲这个东西没有说说到它的一个本质的核心,其实你完全可以等价于这种理解,就是函数呢,就是我们一个对象的方法,而它引用的环境呢,就是它的一个属性。其实本质就是这样子的,那么现在呢,我们不说那么多,我们直接啊给大家看一个案例来理解一下就可以了,前面我们已经用到这个B包了啊,前面还记得同学们看了一个函数叫minus。
03:11
XY这里呢,我返回了一个匿名函数,就是呃,YT,这个X减Y,当时同学们还记得我只要给它附了一个二次进去,就我给一个函数付了一个20进去,那么这个时候这个20。本身这个20呢,它是属于这个,你看啊,这个是一个函数。这个是一个函数,那么这个函数呢,它用了一个变量X,这个X其实不是它的,是从它的另外一个外部传进来的,所以说我们认为怎怎样是一个地方呢。我们可以这样理解,就是这个匿名函数加上它的一个外部变量X,构成了一个B包。哎,这样理解呢,就很清晰了。就说这个函数是谁呢,是它。
04:02
他干什么呢?这个家伙啊,他用了一个外部变量,这个外部变量还如影如影随形的跟着他走,因为一般的变量是呃,就是用完一次就没了,但是这个东西你调它的时候,它始终给你绑在一起了,所以说我们把它形,把它认为是这个函数将这个X闭合起来了,相当于说我这个函数把它。关到我这个里面去,就形成一个B保啊,这个名字取的也是非常的形象closer啊,取得非常形象好,那不管怎么样,这个案例我们就就不再演示了,同学们一看就知道什么意思,我就输出结果就行了啊。好,待会呢,我把这个语言给它整整理一下就行了啊好,我们针对这个案例说一下,这个结果应该是呃20,呃一这个X传进去是它就是20减Y,那这个是19。好,19完了过后呢,这个X20仍然是在这个位置没有动过啊,没有动过,没有动过的话呢,这个20呢,其实呃,就应该20减去一个28。
05:02
20减去一个28,就是这么一个意思啊,这么一个意思,甚至有些人写的比较比较有意思的是他这样写。他这样写。呃啊,这个还不能改变啊,就基本基本上也就这样写的啊,有些有些语言里面这个X呢,是变量,它还可以在内部进行递增,只是我们是看呢,因为这个X传进来,它是一个V的,你还改不了很多语言为了讲解这个,当时我为了讲这个B包,我一般是这样讲。我这样讲,我说这个加加X。我我让他,我让同学们想一下这个X每次是怎么加的啊,但是在我们这个SC里面这样写它是错的啊,因为第一个语语言不止,第二个及时支持,你这个X也是VL,你你也动不了它啊,你也动不了它,好我们对这句话做一个小结,我这整理了这么几句话,大家看一下就行了啊第一点。这个返回的是一个匿名函数。
06:00
就针对刚才那个代码小结的,因为该函数引用到函数Y的X,那么该函数和X整体形成的一个B包。啊,也就是说这里的VR这个东西F。这个函数就是一个B包。啊,其实函数是一个B包,有些人还可以更进一步,函数的本质是一个对象。啊,你可以这样理解,返回的函数是一个对象,而X呢,就是对象的一个字段,它们共同形成的必包。当多次调用F时,可以理解成多次调用B包,会发现使用的始终是一个XX没有变化。啊,不会说你掉一次我就就没有了,那么在使用B包时,主要要考使用B包的核心关键点在什么地方呢?我总结了一句话啊,这些语画呢,都是我自己去总结的,书上也是没有的,当然呃呃也是一些大白话,主要是要搞清,搞清楚返回的函数到底引入了函数外的哪些变量,这个是个关键点。
07:02
因为他们会组合成一个整体,就是我们要搞清楚一个B包,你要把它分析出来两大部分,一个你到底是哪个函数,第二个这个函数到底引用了哪些变量,那就意味着我们这个闭包不一定是只是闭合了一个变量,它可能是闭合了多个变量。啊,这是有可能的,好,这个小代码的小结就到这儿,我们现在呢,来一个最佳时间,我们写一个案例,加深一下大家对这个B包的理解,来,那么老师把这个代码大家写一遍。好,我写一遍这个B包的案例啊,Close CS cure啊,Cure这个DEMO the DEMO,来,朋友们。给大家快速的走一遍,你用这个方式去理解Java的或者javascript的都是一样的啊,必包的概念完全一样,好,那现在呢,我把这个需求给各位朋友绑到这。好这个我我先这样子啊。OK。
08:00
我这样写到这儿。好,先看这个人家的需求。先整理下一个代码。好,他有这么一个,呃,这么一个需求,第一点。编一个函数。啊,返回一个背包,第二个调用B包传入一个文件名,怎么怎么样好第三点。把他的需求先搞清楚,我们念一念。好,我们念一念,这个应该是他给出的一个提示。好,我们来看一下啊,说写一个函数叫make six。这个make surface呢,可以接收一个行参。呃,可以接受一个什么呢?呃,比如说这个一个文件的后缀,比方比如说像点勾PG。然后返回的是一个B包,这个B包是什么样的B包呢?它有要求调用这个B包。这个B包可以接收一个文件名,看看清楚,人家说要接收一个文件名。那也就是说我们这个,呃,这个B包这个返回的匿名函数呢,它应该行参也是一个周串,该文件名呢,如果没有指定后缀,就说你这个传入的给B包函数传入的一个文件名呢,如果你没有这个后缀。
09:07
它就返回你这先前设置的这个后缀。OK,那么如果已经有后缀呢?返回原理,那我举个例子,比如说比如说这样子啊,比如。比如我们这样调用,比如我们传的文件名是,文件名是什么呢?呃,我们第一次先假设设置了一个勾PG啊勾P文件名,假如是呃,Do,那么返回的就应该是do,点勾PG。啊,如果我们我们传的这个文件名啊,我们文件文件名是这样子的是KK点勾PG,那么我们返回的呢,就是K点勾PG,就说相当于说补补齐这个后缀。但这个后缀是谁指定呢?是你在第一次。产生这个B包的时候,就给它扔进去了。
10:02
好OK,好,现在呢,我们来玩一把,那快速写啊,时间的关系呢,我就快速写一下。好,写到这DF,那么make这个我就。粘贴复制过来。好,我们来一起玩一把,那首先呢,我们让它返回的是一个B包,因此这个地方千万不要用unit,让它类型推导现在返回。返回一个,返回一个匿名函数。该匿名函数会用到这个S会。会使用到。啊。会使用到什么呢,Six?好,快速写下,那我开始写代码了啊,首先行参给我写上。因为以前了会传一个文件表。它的类型是string,好,按照我们匿名函数的写法,应该是这样写,里面的代码可能比较多,我觉这样写的啊,如果。如果name名字他有这个有这个后缀,这个后缀就他你看我用到它了。
11:07
这样形成密报。如果有它。所以如果有这个后缀名,那我就直接把这个文件名返回,OK,那么如果没有啊,这这个我写的有点长啊,你们可以写在一行,如果没有就怎么办呢?加上这个后缀,这个后缀是从哪来的呢?从哪来的?就这么一个逻辑代码,很简洁,但是很能说明这个问题,好,这个就写完了。写完我们来用一下啊,使用一把。我们看看这个怎么使用啊。好实用。使用并测试。那现在呢?我先接收一个B包函数F等于make。好,我传进去一个后缀,点勾PG。当然我也可以是别的二平方GF啊都可以,我就写的就是勾PG,那么勾PG完了过后呢,我们来玩一把,现在呢,我们来测试一下F。调函数,注意,这个时候传的参数可不是给他传,而是给他传,大家看懂了吗?
12:04
啊,应该能看懂,我传入刚才写的这个do,点勾PG,好,这个时候返回的内容呢,它输出的文件名就是它,因为我有这个后缀。因为你在这面函数匿名调的时候,它是走的这这这个流程。好,如果我这样调用。说我给他传了一个什么呢。Catch没有这个后缀,它就给我补齐这个后缀证并返回,那也就说我们只需要传入一次性,我们只要传入一次这个后缀名,后面呢,我们这个后缀地址给我们这个F绑定的,因此就不用反复的再复制,如果你用普通的方法来做,普通的函数来做呢,你每次都要传一个参数,因为普通函数它是不保留这个变量的。掉一次就没有了吗?你还不能把它整成那个全局变量,要全局变量就就更不好了啊,所以说我们我们这样一执行呢,我们可以看到这个运行的效果跟我们想象的应该是完全一样的。
13:01
啊,大家看看能不能理解啊。再再看一下。应该很好理解,我举的例子都很简单,因为讲语法呢,我们尽量举简单的案例,讲项目呢,咱们应该举更复杂一点的案例,这个逻辑是这样子的,语法最好简单,你看返回的就是它。这个家伙呢,他用到了外部,因此呢,我们认为这个匿名的函数跟S形成了一个必包。就这么简单,那有些同学可能就要问了,说老师你这个B包它到底有什么好处呢?你说了整个半天对吧?好,我给他整理了一下,就是B包的好处呢,要我们默默的体会啊,你看你返回的逆令函数和这个make s的SX变量形成一个形成一个必包,因此在这个引用到它了,那么我们来体会一下的好处,我觉得至少有这个好处啊,很很形象的或或者很直接的感受到了。
14:00
我问大家,如果我要求你们用函数实现。不用B包,只用函数实现,普通的函数实现。你也可以很轻松的实现这个功能没有问题,但是传统的方法需要每次都传入这个后缀,你没有办法。因为你用一次函数后面就没有了,除非你把它整成一个全局变量,但全局变量它又破坏了什么呢?破坏了一种东西,什么东西呢?就是你用外边的东西,尽量是要避免它。破坏了这个纯函数的概念,所以说如果你用传统方法,你你可以去试一下,你每次都把这个勾屁传进去,因为不然的话你就不知道后缀是什么,但是而B包因为可以引用到上次引用到某个值,所以我们传入一次即可反复使用。哦,至少有这么一个好处。至少有这么好处,那么这个特点说到本质上呢,其实就是类似于对象属性跟方法的关系。大家可以再领会一下,好,那关于B包老师就讲这么些啊,啊老师就讲这么一些,大家呢,更多的是要自己去体会,核心点就这一点。
15:06
啊,核心点就这么一点,并不多好,同学们,我把B包给各位朋友啊,板述一下。B包。好,B包呢,我整理一下刚才我们讲的这个B包的内容,做一个再次回顾啊,B包close。OK。B包来一个标题二。对吧,这是讲的B包,那我对B包讲了哪些内容呢?我先讲了一个基本的介绍。啊,给他讲了基本介绍,说B包是一个什么样的概念。啊概念,然后呢,做了一个案例的演示,啊,这个案例呢也很简单,就是刚才我们写的这段代码,然后对这个代码呢,我做了一点总结,大家看一下总结是。打细化啊,我这写到代码的总结对。
16:00
对上面代码的一个小结和说明。对吧。啊,咱们做了一个小结和说明,来给他一个小箭头。给他一个小箭头,那么我总结了哪些说法呢?我总结大概四点。大概四点,对,诶这四点呢,我就不再念了啊,刚才我们已经念过一次了,再给大家整理一下第一点。啊,第一点是这个意思,然后第二点呢,你可以怎样理解对吧,第三点。是这样理解的,第四点是这个有些呃,有些这个有些语言里面直接把这个输出来,直接就看到是对象了。比如说有些同学学过像脚本语言,像Python或者PHP的同学,你可以去输出他直接返回的是object啊,那个就更能说明问题,但是我们这说不出来,他在这个对象里面又做了个包装,把function函数当成一个对象了。
17:02
啊,其实大同小异啊,语法这个事情呢,就大同小异,好,同学们关于必报的这一块说完过后呢,我们这还举了一个最佳实践案例,这个案例呢,我要求同学们晚上自己自己去写一遍啊,你不要看老师的代码,你自己写一遍。啊,你这写面你会感受到它的一个一个特性。好,最佳实践呢,我也给同学们放过来。好,这是我们的案例,我们要求写的需求是第一个。啊,调用B包可以可以干什么事儿,然后呢,要求用B包完成最后代码呢,给同学们放到这儿,代码就是刚才我们在这个地方写的代码是哪里,是这closer DEMO。好。好的同学们,那关于B包我们就给大家讲解到这里。
我来说两句