00:00
好,我们来看下一个叫常见的B包。第一个呢,是将函数作为另外一个函数的返回值,什么意思啊?是啊,我们第一个Y函数FN1。是吧,接下来我定一个F好。是吧,我把这里面内部函数作为外部函数的。子。看到这个结构了吧,啊,但这样产生密保了吗?有没有产生欲望,没有,那我比如说老师得刚说了调它产生欲望了吗?有没有没有。啊,得先至少要给什么啊,定义一个变量,是不是接着我在内部函数里面去干嘛引用这个变量,那我这一次引用的方式改一下。
01:09
这也叫引用法,就是无论你怎么用,反正只要是引用就行,对不对。你用就是使用啊好来看一下我外部怎么用呢,我外部这么执行又得到什么。是不是得的也是函数,简单来说更直接的是不是说这个函数,那我是不是可以用一个变量来存。可不可以,可以吧,那你说我的这个输出输出了吗?有没有输出啊,我问问题,这问这些问题不是随便问的,很关键的,你要回答不上来,自己有问题的。没有。我还没自习呢。但必产生没有产生,没有产生了。
02:05
叔叔。长山。三那我重新再标一遍。这一步估计不是同学知道,这这一步非常关键,经是四。是不是A在不断的累加呀,A在累加说明一个问题,说明A没有消失。但是你在想A是一个什么变量,是不是主变量嘛,是不是FA1里面的主变量,A什么时候产生,是不是执行F1的时候是不是产生,我们说逐变量不是在函数调用的时候产生了,什么时候死亡,正常情况下面调用节触是不是就死亡。
03:01
但是你就得想啊,如果你说是三和四,那他就没有死。对不对。啊,这个要搞清楚啊,OK,来,我们先来看一下结果。是不是三个四啊?好,在我们分析之前,我们先来再问大家一个问题,请问整个过程中产生了几个细胞?对吧,那你先回想一下我们B包是怎么产生的,对不对。是不是要创建函数对象,就产生了内部函数对象,对不对,你是不是创它不是B包,是内部函数对象里面的吗?那请问我这个整个过程中创建了几个这个内部函数对象啊,几个一个。
04:07
你说老师你不调用了这么两次吗。那是在直行函数。这么调是不是在执行这个内部函数?是在创建函数吗?不是。对吧,那如果我想产生两个。必报对象,我该怎么做怎么办?我想再产生一个。你就要想嘛,你就是通过哪一步来导致于它产生的嘛,最关键的一步在哪里嘛,对不对。这么一执行,我是不是又把内部函数对象又减了一次啊?能不能理解,说白了怎么样,看我的那个必报对象创建几个呀,就看你的外部函数执行几次。
05:09
对吗?对不对,因为你在执行外部函数的时候,才会去创建内部函数对象。跟内部函数执行几次有关系吗?没有关系。那也就是说,我在反复执行内部函数的过程中。我的那个币包里面的那个数据消失了吗?没有,为什么没有消失了。对吧,来我们先来看一下它的整个过程,好吧,先看一下整个过程。来首先呢,我把锻炼打在这里,接着把这里面也打到锻炼可以吧。诶,大家看啊好,我现在呢走。
06:01
好,请问我现在的这一个锻炼停留的是哪条语句导致的?我停在15号。是哪条语句导致的?哪一行22,这不很明显吗?不调到这FNE1去的吗?其实这个地方有一个东西叫core stack。怎么翻译?扩什么意思?调用step在调用在这一个有一个箭头。这一个箭头是在指定什么呢?指定的是不是当前我是不是正在执行水的代码。FN1。明白懂,那这个是什么呢。这一个是不是定位到了我们的22行,22行是什么代码,是不是全局代码。
07:00
有位是不是选起代码啊,这是一个调用站啊,调用站最底部这个是匿名的意思吧,这一个啊,这是一个,这一个是它那这个东西有点像什么呢。就有点儿类似于有点像我们的那个直行上下文的站。而底部是谁,是不是全局啊,而上面的是某一个函数吧,那如果我FNE里面是不是有可能再去调用别的函数,FNE1里面再调用它是不是又会产生一个,然后我们当前运行的肯定是什么。是不是在顶的那个看的出来吗。能懂啊。OK,现在我们执行的是F1,大家看看啊,我们现在执行的是FN1,在十五行。
08:01
啊,十五行直线FAE好了,那下面我问大家一句话,你说现在B包有没有产生。我已经到15行了,十五行还没执行啊,对吧,十五行的A等于三,A等于二还没执行吗?B包产生没有产生了,为什么B包已经产生了,因为有函数提升。对不对,你别看着我,这函数定义是写在16行。但它早已经执行,早这个定义早已经执行过了,这个函数定义早已经被提升了,能不能理解?你看嘛,这一看就明白了,这这很明显的一个是这里面不有F2吗?这不有值吗。没毛病吧,而且里面有没有我想看的那个东西。
09:02
A,为什么啊,你发现了,接着我点一下它,你说这个A会不会变。变了没有,是不是变了。对不对,好没问题,你看他我执行一行,它直接跳到R上,为什么跳到R上来。因为我们的函数定义早已经执行过了,记住了是函数定义早已经执行过了,对不对对,行挺好。好,接着我再点上它会怎么样呢。会出这个函数。对不对,这个函数会执行完吗?有没有看到?冷不冷了,那大家看啊,现在我们啊到这里还没出来,马上就出来了,马上就出来啊走。
10:00
看懂了,看懂,现在我是不是又跑到这一个匿名的这个这个站里面,这个这个里面实际上是不到全局环境里来了。能不能看到我现在我们在全局环境里面了啊好,那下面我又我现在去执行谁去。是不是直线F好,我就点它,你说会怎么样。我点下。会怎么样?进入雷行。16行怎么可能进入16行,这这16行就停不住啊,十五行,那进入十五行就说明我是在调F1F1啊,是在调FN1吗?我这个执行F这个函数,实际上执行的是哪个函数,你得看明白了。是不是执行的这样一个函数,那你执行这个函数的一步是不执行它呀。
11:01
但这里有个断点啊。你在执行的过程中碰到断点,是不是要暂停了?大家看啊走。这一定要能懂啊。能不能理解好,现在我们是不是直接就看到了他呀,现在当前是几了啊是吧,啊好了,接着变成几了三我是不是输出啊。有输出不?有没有有输出,有输出,接着我这这就执行完了吗?请问此时。我的背包还在不在?在不在在。啊好,那我现在又点它会进了17行是吧,现在我看到已经是几了,是不是三了呀,刚才不已经加到三了吗。
12:05
这一次就变成加四。也就是我整个过程中产生了几个B包,几个一个。其实非常简单,就看你产生了几个内部函数对象,就看你调用了几次外部函数。对吗?能理解吗?你就看你外部还是调用几十倍。你现在是不是外部函数调用一次,你说老师我调用F不是调用外部函数吧,F是调用外部函数么?不是调了什么内部函数。这个过程要能看得懂。好,这里说的是我们比较常见的一种情况,就是将一个函数作为它外部函数的一个反馈值,你看啊,这个挺挺特别的,平常我们可能做这样的事做的少是吧,就是将一个内部函数作为外部函数的一个什么返回值,返回也有人说老师我还能还能这么写吗?能吗?能,因为函数也是数据,是数据它就能传递。
13:28
能不能理解?嗯,好,这是我们说的第一种情况,来我们再看第二种也是比较常用的。将函数作为时差传递给另外一个函数,什么意思,我先写一写啊,先写一写写你就知道了啊,我这里面写一个这样的一类竖敌类什么意思?这是个什么意思啊,是不是延迟显示啊,啊OK,好,我这个地方呢,有一个有两个参数需要传,一个是显示什么信息。
14:09
另外一个你延迟多长时间,我要延迟显示一个星期,你说我用什么样的语法就能搞定。要做件什么事?Set time out。是吧,现在我指定一个function,现在我显示就吧好吧。行吧。接着。是不是时间?下面我去调用它,调用它的时候是不是得传一些东西啊,好,我就随便传一个啊。好,先我要个问题再去看。我要问大家,你说这里面有没有B包?看清楚了再说啊,有没有。
15:03
有没有有是吧?那有的原因是什么?一定要想着我们产生密包的几个条件对不对?首先有外部函数,有内部函数。接着是什么?不是调用内部函数,引用了什么外部函数,没这个函数题应该是这样子的是吧?是吧,这里面看谁是因为time吗?是因为什么?是吧?能看到吧,比如说B包里面有这个time吗?没有,B包里有没有没有只有这个什么,因为我们说过B包对象里面包含的是不是被引用的那个变量。被引用的变量是这个time吗?是这个什么买水你看它嘛,在这吗?这里面这个内部函数里面是不是只有你引用了一个变量。
16:08
你说这time是吗?也就是说我要说一个事情啊,假设我这里不用这个message,你说有没有产生密保,有还是没有没有。能不能理解好。打啊。能看到吧,哎,那我能输出吧,这个也最简单,诶,它这里面有些断点是吧,把它断点给它去掉,要等两秒钟。有不要有,你说现在我们写释写来,那这B包到底有啥用啊。是这意思吧,用是用了,感觉也也用起来了,也知道什么是必包了,但是咱说你说这B包到底有什么作用呢,是吧。
17:09
你咱看之前你其实也可以想一想,要没有这个B包会怎么样,其实能看出壁画的作用是不是。又没有B包会怎么样?你说对他来说是不A就是什么,如果没有B包,这个函数一执行,A就是什么消失了吧。是不是,那你要消失了,你想想看,我再用F的时候,我要去A,会出什么问题?会怎么样?做错吗?你的变量不存在了,你去访问那个变量,那个变量被释放了是吧?那不就包括了吗?那B包到底起什么作用呢?是吧,好。
我来说两句