00:00
来下一个我们要讲的概念呢,叫中域与中域链这样一个概念,我们来看一下吧。可以。不需要写什么代码啊,主要是大家一个理解,其实这个大家理解起来都应该以前都学过啊,我们把作用理解成什么呢?呃,就是一块地盘,所说的一块地盘就是一片,一个什么呢?代码所在的。一个区域啊,它实际上状域,它是一个什么呢?一个静态的一个概念,而这个静态相当于是我们上下文它是一个什么,是不是动态产生的,也就是说我那个函数执行上角文什么时候才产生,是不是执行调用我的函数的时候才产生,但我的作用欲。
01:02
是在执行的时候才产生吗?不是,比如说我把这个函数调两次,是不是产生两个函数执行上行文,那是产生两个作用域吗?不是。嗯。实际上你一编码的时候,你什么时候确定中域。你编写代码就确定了。他后面还会变吗?不会变。啊,我们把我们中域分为两大类,一类叫什么全局中域,一类叫函数中域啊这个前面都讲过是吧?啊还要强调一个是没有快做欲,什么叫快做欲。举个例子啊,你就懂了,就譬如说我写一下这样的一条语句,那请问我在外面能不能看到C,能不能能,如果能看到C,那就说明他是没有块状欲的,块状玉是个什么意思?其实就是大括号座欲。
02:10
而这就是一个块,你说这个C被封到这个块里面了吗?没有,为什么说没有了,现象已经表明了我这个C是可以什么看见了。但别的语言就不一样,比如说加va,它就是有块作用语了,在大括号里面,生命的变量在外面,什么不可见。但这个针对的是ES6 es6之前在ES6里面就已经有了块状率这样一个东西。啊,至于怎么做到的,等后面再说。能懂吗?来请。啊,这个大家应该知道快状欲这样一个概念啊,没有块状欲。
03:00
那这个是,嗯,那个面试笔试的时候,由于考的一些比较特别的点啊,这个你要知道啊。好,下面我们来看一下这里面。这里面的一些东西。好,我现在问题是什么呢?我们在这整个里面产生有几个作用欲呢?大家看一看,首先最外面的作用叫什么?作用域,全局作用域是整个范围对不对?接着怎么看公寓?是不是看你定义了几个函数啊,我在你定义了函数,这个函数区域是不是就是我的作用去接着是不是它。我们前面说过,说过那个。执行上下文对象多少个?是什么原则?是N加一原则。
04:02
N是什么东西,是不是调用几次函数啊,那这一个呢?那是什么原则?能不能叫N加一原则?能不能?也是N加一。只是这个N什么意思?对你定义函数。这这种总结性的东西是比较关键的,你就不用记什么东西,你就你就把这个东西消化掉了。啊,而且你跟表达的时候,你的表达就跟别人不太一样,你懂吗?别人问这里面我们产生多少个状语,怎么看啊,你说一个N加一,这个你在书上也看不到啊,其实这都是自己想的这块的东西。这个N呢,代表的是你定义了几个函数,能懂吧?
05:03
啊,有区别的啊。好,那函数作用域它的作用是什么呢?为什么要整作用域,整这么多函数,一个函数就产生作用域呢?这里面有一个非常重要的概念,叫隔离变量。什么叫隔离变量?你怎么跟人解释什么叫隔离变量?嗯。还跟他说了,你要你要你要直接去解释,是没法解释啊,你得举例。怎么举例子,我在函数外部有一个变量A,我在函数内部能不能有变量A?嗯,那就是隔离的变量为什么能存在?因为我们的函数作用域是不是相当于将内部的封闭起来了,外部有A影响,我里面有A吗?不影响,那如果我没有撞玉这个概念,没有撞玉的话,你想那不就冲突了吗?
06:05
实际上是不是就覆盖掉了。那么理解啊,OK。这个非常关键。就不同桌域中。同名变量不会冲突,你说你怎么能?你要背这东西太难了。这个就是我直接去回答什么叫隔离变量。能理解吧,但是你举例子就比较轻松了。我反复跟大家强调,举例子这样一种手段啊。好,这个提到这个这个你看这说明什么问题,我们来看一下,它定义了两个变量,一个A一个B,接着定义那个函数,那个函数里面是不是又有A呀,可以有吧,好多了一个什么C着打印输出ABCX来,但是呢,这个F是不是下面得调啊是吧?执行这个F传了十,好现在问你A是多少,100无非不是十就是100嘛,对吧,100,那这一个是吧,十啊找到外面来是不是。
07:20
能看懂吧,哎,那C呢,3YX是10,这比较简单,其实。啊OK,尤其是这个里面,大家看到我这个A,它是不是直接先找里面的,是不是直接找到了,接着B。他不是直接找外面的,先在里面找有吗?没有,没有怎么办?去外部找。是不是找到了?能理解不好,下面呢,里面有一个八差不多,接着这里面又定了一个A是吧,又有一个形长叫X,又有一个D啊,接着来我打印ABCDX呢,应该是一切,B呢,应该是20,还在外面的是不是C呢?是不是300啊,这里就一个C嘛,D呢。
08:21
400X是是不是掉了,它先是100,后来是什么200。能不能看懂来啊,这个大家应该要能够去清楚,这里面有个图,这个图其实跟我们刚才说的是一个意思,看懂了。是不是三个框啊啊,一个是全局状欲,接着是放状欲,接着什么大的状欲。啊,就这么个意思,我也我也不去输出了,这没什么劲啊。呃,下面呢,我们同时给大家去比较一下作用域与执行上下文啊,用的还是这个代码,代码没有变。
09:10
刚才其实已说过一些,再跟大家叙述一遍。啊。区别一啊,全局作用外,每个函数都会创建自己的作用,也就是我们先说的什么原则是N加一,也就你定义了几个函数,是不是有几个中域啊,一是谁选一中域?啊,状语是在函数定义的时候就什么,也就是说你编码的时候是不是就确定了,尤其是函数状语容易特别容易搞错。并不是在函数调用的时候来产生的,这个搞清楚啊看,而执行上下文环境是在全局中域确定之后,JS代码马上什么执行时间,也就是说动态产动态确定了嘛。
10:03
啊,记住了,动态去呢,函数执行三学是在什么确定的,不要求环境啊,太长了,函数执行三线完是不是调用函数产生的。能不能理解在函数体之前体代码时间才看,嗯,这是产生的时机不太一样啊。这里面主要是说函数中运是什么,是一个静态的,可以看成一个什么静态的就是因你确定编码的时候就确定了,你说白了,没执行之前就确定了,还变吗?不会变了,而执行上下文呢,里面把这个写准确一点啊,是什么动态的,尤其是函数是调用函数时创建的函数调用结束后会怎么办?就会释放掉,而且就会分别写一个自动释放,能不能理解啊,不是什么垃圾回收器回收,是自动释放。
11:10
我们说过了,函数执行,函数是不是要分配一个空间的,内个空间是在什么,函数执行完它就自动释放了,也就是我们平常以前说局变量什么时候释放,局部变量什么时候消失,是不是函数执行完了就消失,什么时候产生,一调用函数是不是就产生。嗯,这个要搞清楚啊。他们的联系啊,有一个什么样的联系呢?这个地方说了一句话叫执行上下文,哎,我把这个换一换啊,执行上下文是重属于所在的状域的什么概念,这里有个图,这个图可能说明问题。就还是刚才那个那个东西啊。
12:01
大家想啊,我们外部是不是有一个函数,应该是叫FN吧,是吧,这个大家还没还没整出来,我要画换掉了,来这里面调用这个FN,调用这个FN是不是产生了一个什么。是不是一个直行上下文函数,直行上下文对不好,我跟大家说一下,这里面有有一些什么样的东西啊,哎,这个这个是还是外面的啊,你是没划掉,看了外面这个框是什么东西,你说。这三方什么作用啊,是不是作用欲能不能理解,那坐欲开始是不是有了啊,开始有了,好接着啊,刚才看看到看出来这里面有FN了,这是不是全局代码,全局代码这些A和B放哪去了。啊。
13:00
在哪个里面A和B,它是不是要变量提升了,提升到哪去了,是不是全局执行三角啊,它这边就我们开始最先写的是全局三角环节是一个意思啊好,这里面是不是有个A有B有个D,应该说对吧,这都写错了,看到吗?应该是有个A有什么B。好在这个里面大家看实际上是谁呀。是不是就是问,那么你来。好,下面接着我是不是定义这个函数。定义的函数以后是不是调用这个FN。好,第2F分的时候会怎么样呢?我们说是不是又要创建一个执行上下文,那执行上下文里面有一些自己的属性,哪些属性X有没有C,有没有C,有没有有B吗。有没有B,假设我现在去输出B,它是怎么样一个流程,先我输出B,我输出B是不是找,我们说找本质上是不是在这里面找的,首先在它当前的作用域所对应的这个上下文里面找吧,能不能理解啊,在当前这一个作用域所包含的这一个执行上级文中找能找到吗?没有,没有找回来怎么办?是不是外部作用域里面所对应的什么,是不是直行上角文中找能不能找到,能实际上这个是B啊。
14:36
有没有看到,嗯,好,接着我下面去执行这个B,执行这个B是不是又产生了一个新的什么函数,执行三角形吧,啊,那此时如果我去输出输出C怎么找的,我去数谁先还是一样先在里面找有吗?没有没有怎么办?上面找那我要输出B了。
15:06
对吧,他实际上是不是有一个早的流程。那不懂。但是我们平常不会想的这么复杂,知道吧,平常我们想这个作用力有没有是吧,外面作品有没有。甚至有可能我一眼一看啊,外部有。那实际上你利用了你的跳跃思维嘛。是吧,能不能懂我说的意思就是我如果找这个C啊,如果我找这个C啊,可能会看哦,就在这里。是吧,但真正程序找的时候,他是我们这人这么找法吗?不是,其实你的眼神已经瞟过去了,知道吧,你是不是用眼睛瞟了一下那个吧。你们的A和D,你不要告诉我,你没表。能不能懂啊啊,你已经很快的把那个把那个流程已经执行过去了,对不对啊OK,甚至于说我找B的时候,尤其是我找B的时候啊,你看到好,这里面有B下面没有,这中间也没有,只有上面哪里输出20的。
16:17
能不能懂啊,其实这个比较简单啊,并不难。好,这样呢,我们就跟大家去说了一下,庄玉以及庄玉与执行上级文他们之间的一些区别和联系啊。就把这个作用念也说一下吧,因为比较简单。我们看一下什么是坐欲念呢,其实非常非常简单一个事,其实刚才我们就就在看坐欲念啊,我们在这个地方就是实际上什么叫中用链,就是嵌套的坐欲。产生了由内向外的一个过程,能不能懂,或者由下向什么向上,也就是说譬如说举个例子,我们这里面打印C,是不是直接看到当前这个作用里面的这个C啊,这个没什么好处的,主要是现在我们看B。
17:15
B看的过程什么,先在当前作用,你看有没有没有,那怎么办?取上一级外部作余,你们看有没有,有吗。对吧,那现在呢,我们有一个现在去看A,看A还是一样,是不是一层先看先看当前多域没有,接着看外部多余有没有也没有看最外面的多域有没有,有有就输出呗,对不对,好看D。D最终的结果是什么?是什么报错?能理解,不是报错,但是报错它其实也有过程的。
18:00
是先要找,把这整个作用件都找一遍,发现到了最外面还没有,没办法了,他只能报错来通知你,你必须你没有定义,那我没办法了。那么理解。啊,这个其实就在说什么作欲孽嘛。嗯,OK。嗯,这个里面来,我把我把这个其实非常简单啊。啊,它可以再来一个F2是吧,多一个C等于三,那我是不是可以去输出C,可以去输出什么B可以去输出就可以输,我还可以尝试输出D对吧?好,我最终怎么样输出,把这些输出执行。
19:13
我调用什么FN啊,可以了吗。不可以,你就调F2 f1没执行,你有什么机会执行呢。你们说这还用说吗?那那你要觉得没有必要说,那那就没问题,我就怕大家不知道,或者有时候忽略掉了。能懂吧,现在的结果应该是什么?321这个什么包括。构错是肯定的,对不对?是不是三一啊。说什么?D只not DeFine d没有定义嘛,平常的时候我们就可能就看这个D没定义,这很正常,但是你要知道他报错也前提是找了找了半天没找到。
20:13
对吧?找谁去,沿着什么找坐欲孽来找。对不对,对吧,啊,我就不说那个那个执行三角网刚才不说过了嘛,对吧,再说你没什么技能。啊,就是这个。确实实际上是跟我们前面的比较简单一点啊,或者说有了前面的做基础以后,再去理解这个东西就并不难了。
我来说两句