00:00
那下面呢,我们就要去看一下那个B包的作用,其实还是用这个代码,不用写新的代码诶。其实说大家明白了啊。就首先我们要我们要想说B包的作用其实非常简单,就是想的啊,我要问两个问题,第一个问题,如果没有B包,我这个函数一执行完,我们前面说过局部变量就会什么自动释放,那我们后面再想访问还能访问吗?不能,这是第一个问题,第二个问题。作为一个局边来说,外面能不能直接看见?能不能直接看见不能,但是实际上我们最后有没有在外部去操作这个局部变量,有,哎,这也是很牛的地方。我们又看不见那个主变量,但是我们通过B包这个技术,能够在外部去操作那个变量,是不是相当于间接可以访问了。
01:04
能懂不?我直接看不见,但是我采取一定的手段就超过它了,你要想操作时间是不是就看见的,但是不是直接可见的,你肯定没法直接可见,因为它是个足月量。封闭的嘛,前面不说过了吗,对不对。嗯。而B包的作用是什么呢?第一点,使函数内部的变量,也就是局部变量呗,是吧?在函数执行完后仍然存活在什么内存中?本来他该死的是吧,但是由于B包的存在,他死了吗?没有死,那是不是延长了我除非呢,什么生命周期。能不能理解本火产生的时间没有变,但是主要死的时间滞后了?
02:02
那不就延成了生么东西吗?这个能不能懂?能懂吧,那下面再说一个,让函数外部可以去操作到函数内部的什么数据,这个数据可以是变量,也可以是内部的函数,这都可以的,因为函数也是特别的变量嘛。也就是说在前面刚才再跟大家说一遍,对于局部的数据来说,就函数内部的数据,外部能不能直接可见不可以。要可以的话,就不产生冲突了嘛,容易对不对,我们前面说过了,函数作用域,作用域的作用是什么。隔离变量是吧,所以什么叫隔离,就外部能不能看到,内部的不能。内部能不能看到外表可以,因为会找什么作用链对不对啊。
03:02
但是我们通过B包是不是能够在函数外部去操作函数内部的数据,可以可以,这就是它的作用。OK,有的时候我们想把数据包起来。但是呢,我们又想向外部能够让他看到,让他隐约的看到一些操作。什么意思?可以说举个例子吧,我这一个函数是一个封装体是吧,它内部有一个变量。可以吧,那我能不能,我希望大家设计一下,能不能让外部能够读,不能写。能理解吧,也就是说我要不封装起来,是不是外部就只要一看直接看见了,他是不是就能写,就能改啊,但我现在只希望他能读。你说该怎么办?这是一个函数啊,假设叫F1,它内部有一个主变量是三,我现外部能读到这个A,但我不希望他改变这个A的值。
04:16
甚至于说,我希望他每一次访问我的这个A呢,就加加你不能干别的事。你看到了吗?就是我就希望每一次你访问我,你可以每次对我进行加加,但你不能进行别的操作,别的任何操作都不行。有没有这种可能性,有吧,因为我如果让你直接可见的话,你是不是就可以随意的改了。是吧,但是我希望外部只能是对我这个A进行加一。我不希望你进行别的操作。那你说怎么办?其实我们现在的这个就是这样一个意思,我们现在这个就是这个意思,你看内部封装了一个什么,封装了一个一。
05:04
你外部能直接读到我这个R,读到我这个值吗。能不能读到,读不到你根本就读不到这个值。看到了吗?我是不是只是向外部暴露了一个让A加一的一个函数,这个函数不就是让A加一吗?能看到吗?那个一加一能不能懂啊?只是我们这里面没把它返回,我要我要让外公看了,看了这个A,我是不是可以把那个A给他返回,可不可以,但是你看到的这个A是我加加以后的结果。是吧,啊,反不反A得看你的需求,你是不是让外部看见,还是只是每一次让那个A加一,但是你看不见,我只是输出了一下,让你看看最终值是多少。哎,你说我现在的搞法,我能不能,我现在的情况,能不能让通过一年方式让这个让这个A能减减呢,现在能减减吗。
06:05
不可能,因为我没有提供这种操作,对不对,我现在根本就没有提供对A进行减一的操作吧,但是你能直接看到吗?不能,所以说你没法减一。是吧,好,现在有人说了是,我就想减一,能不能做人,你再搞一个什么。你是不是要再提供一个函数是吧,能不能做呀,第一说来一个什么FN3行不行,我要每次让A减一,怎么A减减可以可以吧,可以,我打印输出是为了看准让别人看到H的减是不是,那这样够了吗?够不够那怎么办?是不是想办法把它什么要暴露出去,是不把它return了,那关键是要你譬说我要return改一下,那你说会现在会怎么样呢?
07:14
我现在这么整,你说会怎么样,你说输出多少这个。书籍一这个零能不能看懂?能吧,OK,只是加边写的嘛,不还是一样的。对不对。啊,这个大家应该能够去搞清楚。啊好,现在我们还有两个问题要问大家,还有两个问题问大家啊,大家一定要理解啊,不差背的,这你背一点用处都没有,你就是拿着这个东西拼命背,你背出来有啥用呢?这些东西都是靠理解消化的。函数执行完后,函数内部生命的逐变量是否还存在?
08:05
也就是说我的这一个这一个函数执行完后,这个A存不存在,存在存在的原因是什么?是不是他在背包里面能不懂,好那我就问大家了啊,我问一下大家,你说我这这种情况,我执行完后这个这个函数对象这个函数对还在不在。还在不在?在还是不在,不在了,为什么它不在了,没有人引用它,那个函数对象就不成为垃圾对象了吗?就是说这个是不是一个相当于是个局变量嘛,这个比面有没有在B包里面有没有啊。没有没有会怎么样,是不是自动释放A有没有被自动释放,是不是没有啊那FN3。
09:10
有没有自动是吧。FN3。那你说没有是什么原因呢?它在B包里面吗?啊,N3在B包里面吗?FN3不也是个变量吗?它在不在B包里面?塞尔B包里面有都有,谁有B包里面有谁就有A吗?有FN3这个变量吗?没有,那FN3会在函数执行完以后会怎么样?FN3这个变量它会释放?有人可能就纳了闷了,你说FN三都释范了,那你们函数对象不就成为垃圾对象了吗?函数对象成为垃圾对象了吗?为什么没有?是哪力导致他没有释放的?
10:01
多少行不是29行,是31行,为什么31行呢?你看我用一个变量来指向的,随意指向的这个函数对象,哎,不是这个。是不是这个能不能懂。是吧?也就是说,B包最终存在,一直没有消失的根本原因是谁导致的?导致的。F是不是指向函数对象,函数对象是不是关联着我的那个什么B包啊,是不是我B包里面有谁有A对不对。这个关键点就在于我用F把这个返回值给它存起来。
11:03
是吧,我return的时候大家看啊,我return return的是FN3,实际上是FN3的那个地址吧,它里面它里面内部保存的一个地址。自来晚上的理由。是吧,我一旦反馈以后,这个FN3这个变量本身还在不在,关键点就在这里,一定要看清楚FN3本身还在不在,不在了。是吧?但FN3不在了,并不代表我的函数对象成为垃圾对象了。是吧,为什么F引用的?看懂吗?这里很关键,F引用的。你只要有一个引用变量指向这个对向这个对象不会成为垃圾了。F是不是指向这个函数对象,是还是不是是?
12:02
这个大家应该要知道啊。好在函数外部能直接访问函数内部的变量吗?不能不能不能啊,OK。这一个是否存在,一般情况下是不存在的。一般是不会存在的,那什么时候才存在,因为存在B包中的变量才不会,才会存在,对不对,能不能懂。啊,这一个我说的也是,可能是首先还是要那B包所在的函数对象,要不是垃圾对象,它要成为垃圾对象,它也会消失,说白了,我这里面要不不保留这个F,执行完了以后,你说的B包还在不在不在了。
13:06
为什么不在了?没有引用指向那个函,内部函数都要成为垃圾对象了。嗯。看到吗?啊,这个挺关键的啊,啊这个不能。对吧,外部是不能只看,但是。通过B包这个技术对吧,让外部。操作啊,能不能理解,其实这种形式就是一种形式啊。常见非常,为什么说这种外部函,外部函数有个内部函数,把这个内部函数给他什么呢?这种搞法其实挺常见的。这样的话,你就能够让外部能够去操作内部的数据嘛。
14:05
这里面我们就能看到B包的作用是什么,有两个再强调一遍,第一个在函数执行完了以后,它内部的逐变量。还可以存活在什么内存中?嗯,就因为必包嘛,是吧,那说明这是必包的作用嘛,第二个让函数外部可以,既然它存在嘛。既然它还存在内存里面,我们后面是不是有进行操作这个数据啊,能不能理解,首先要保证那个函数执行完以后,数据还在,还在以后我们才能操作它,你要不在了怎么操作呢?大家得仔细仔细的想一想啊,让函数外部可以去操作函数内部的数据。
15:01
这是我们说的必包的两个柱。
我来说两句