00:03
嗯,哎呀。下面我们要就介绍一个新的概念了,这个新的概念叫执行上下文。来在说执行上业完之前呢,我们先介绍几个概念,首先代码分类,这个分类呢,是根据什么呢?位置来分,这个大家懂,一个叫全局代码,一个叫什么函数代码,也可以叫什么局部代码,可以吧,可以没问题。那下面呢,我们来去说一说,看这里。汉子啊,我问我刚才还是刚才那个啊,过一个3A1吧。等于三,那我上来开始是不是就能反到A1,刚才已经说过了,是不是好,那我定义了一个函数A2,那我就可以直接去访问什么是不是AR呀,对不对,对的。
01:08
好,那我一上来我就可以去访问一个东西。能不能访问,可以可以,我能访问是不是说明他已经在了,那已经在了,说明在执行我这个全局代码之前,他是不是得做一些准备工作。是不是是。啊,还有一个事情,这些东西去哪找的。大家应该要知道,我A1相当于写什么window.a我这个A2啊,我现在不是执行AR吗。这AR执行一下好一点啊是吧,那我完整写法应该怎么写可以怎么写看可以,其实刚才大家已经看到了,这些东西都在哪个里面,Window里面。
02:07
啊,OK。现在执行肯定是没有问题,这都比较简单。大A大应该能。上面两个上面一个一个是两个都是find的吧,是吧,还有后面的这个ARAR没有的,没有写东西是吧。有吧,嗯,有没问题,后面的this是window,这个都没,大家都懂啊,都懂,但是我要说的是另外一个新的东西。啊,我要跟大家介绍一个概念,叫什么呢?全局执行上下文。怎么看呢?这里面要读一读啊,在执行全局代码前,我们刚才说过了,是不是要做一些准备工作,那个准备工作是怎么做的了,这里面有三步。
03:00
有三步,第一步,在执行全局代码前将window确定,为什么呢?全局执行上下文。这是第一步啊,Window是不是在之前已经有了?Window代表什么?是不是代表整个窗口啊。是吧?Window翻译过来不就窗口的意思吗?啊,就浏览器窗口。好,这是第一步确定为全局执行上下文,下一步对全局数据进行什么呢?预处理?怎么个预处理法?就要收集数据了,收集哪些数据了?第一个用R定义的什么全局变量?它的值是多少?好,这一步非常关键。这步大家应该能看到结果,大家实际上是看到结果了,对不对,他是不是将这一个YD的全局变量添加为window的属性,我们刚才是看见了。
04:01
接着方显声明的全局函数,它是不是已经创建好函数对象了?现在干什么事?添加添加为window的方法第三步,This要不要赋值?要复制为什么window?有没有看到,也就是说我在做这些事情的时候,我的函,我的那些权限代码执行没有是没有。但是是不是马上会执行。也就是说,在我执行全局代码前,他是不是要做这个工作?对吧,好,下面下面才开始干嘛,执行全局代码。那也就是说大家想啊,大家就要想这个事儿真正执行的是这么做,是这样执行的吗。是这么执行的吗?是不是不是。
05:00
你还看着一个现象啊,我让大家看一个现象。大家就能知道一些东西了。所以说我在这打个断点啊,在这在这是吧,看我这个这这个操作是怎么操作啊,是不是一行一行执行呢。走可以吧,走没问题。不太对。嗯。这中间是不是过来了,是过来了吧,啊过来了啊,但是我要问大家,你说我能进入35行吗。能不能,为什么不能对他已经执行过了,这跟我达不达这个到点没关系啊,大家不知道为什么他总是不跳到这里来,你看看到了吗,他是不是直接从34行跳到了什么38行,其实非常简单,主要是这个代码其实已经什么执行过了。
06:06
能不能理解,能骂啊,OK,好,就是这个是大家需要知道啊。那现在我就问大家了啊,问大家你说我我去我前面,也就是说我在执行伤残之前,是不是就做了一个创,准备好了一个全局执行上下文确定为谁window,而且往window里面是不是添加了属性和方法,那我去找ae的时候怎么找的,去哪找?我找A去哪找什么全局执行上业文去找啊。对还是不对,对的吧,对的,刚刚我们说过了,我找A1,实际上是不是相当于什么window点是A1。
07:00
但实际上他们还是有一些小细节的差别的,但是这个小细节大家可以暂时先不用管它啊,因为我现在要说那些小细节,大家容易乱套,所以我就不去说了。大家想我们现在去A1,实际上是去全局执行三角文中去找了有没有问题这个点。没有好下一个,那我们去我们去执行,譬如说我们去这么写。啊,不要在window,我们直接调用这个函数的时候去哪找,首先我是不是还是去找AIA了去哪找一样去window中找。能不能理解,无论我是去查找变量还是查找函数,都要去哪找温中找?好,有了这一点以后啊,OK,这个主要我们来说明的是叫什么全局执行。
08:04
上下文是吧,那下面我们要说另外一个东西叫什么呢。函数执行上下文。这个不太好理解,嗯,来我们先说明一个函数叫FN,可以吧,可以好,下面呢,我们在这里面一样,跟大家差不多,我生明一个A,等于三生明一个方险啊,嗯,等一个F。Fun吧。可以吧,可以没问题,现在我把这里面呢,写个打印输出好,而且呢,我还定一个行参。可以吧,好啊,第一行了,别定义这个了啊,这里面来一个来一个A1,来一个写好一点啊,来一个A2,来一个A3啊,这么写好一点。
09:03
你说上面我能访问哪些东西?A1,能不能访问?可不可以?可以,那我还能访问什么?A2,还能访问什么?A3,能不能访问人,甚至我应该还可以什么?是不是调动执行?那除了这个还能访问什么?This能不能访问,是不是可以可以,那好了,那大家看啊,还有一些东西,我们说不知道这个东西大家见过没有。有没有见过,有讲过吗?讲过啊,你忘了没关系啊,忘了不就不要紧,但只要讲过就行。好,来,我们来看一下行不行,那你说我现在写的,你说人会会输出吗?会不会。
10:07
这能输出,这肯定不能输出了,我还没什么调用了,我传一个传个三。贵能不能套上了,可以可以好来,我先问大家这些书是什么,这个书是什么啊,那这个呢。那这个呢,是不是输出A3括号啊,对不对,这个谁文那这个。什么东西二三你看二因为什么三,那这个到底是个什么东西呢?啊内数组或者叫尾数组。
11:23
能不能看到那么啊,这尾数组,尾数组里面包含两个数,一个啊一个什么一个三,来看一下我们的这个推断对不对啊。嗯,从哪开始,这个地方得打印输出一个分隔符。嗯,首先是二是吧,我的时差嘛,对不对,时三数据接着是我安发了是吧,接着AA3括号接着window,接着是我们那个什么是尾数组啊,是那个尾数组,它是真的数组吗?不是真的数组啊好,那下面就要说了,说一个东西叫函数执行上下文。
12:21
这东西到底是个什么东西?在调用函数时?调调好准备执行函数体之前。它就会创建一个对象,这个对象我们把它称为什么呢?函数执行上下文对象这个有点长啊看那创建它做什么呢?下一步做什么呢。跟上面差不多,先确定执行三角文对象,你看上面不也是一样的吗?只是上面的时候我window是不是早已经有了呀?我需要创建那些吗?我需要,但这里面我必须创建一个,接着做个什么呢?
13:01
对局部的数据进行什么运意处理?怎么个处理法?对吧,怎么个处理法,首先行参是不是变量。你形象变量要不要赋值啊,要赋值为什么,是不是13数据接着干嘛呀,添加为执行上下文的什么属性,这个执行文是不是函数执行上下文呢。啊,天牛为它的属性,记得有没有阿子。是不是代表所有的时差列表?是吧,我直接去看了嘛,我直接就给法官的,我又没我又没准。也就是说,在我的函数体执行之前,这个argument是不是已经在了?而且已经什么有值了,有没有值,有值。那在预处理的时候,他就会做这个处理。
14:03
好,接着是上面两个,这两个根全局了,是不是一个意思。能不能看懂啊,跟全举的是一个意思。好了,这个this是不是一个意思,只是说this它是不是要指定为调用函数,那个对象一定是问的吗?只是我们当前是什么window,因为为什么是window,因为我就直接调用号码。是这意思吧,好,那做完这件事情以后,我们是不是执行函数题的代码,那执行函数体代码的时候,我是不是去查找这一个变量。是吧,好,我找A1去哪找啊?对吧,我们平常是不是就说去桌里面找。平常不就这么说吗,对不对。
15:00
啊OK,但是呢,这里面有一个新的理解,就是去我们准备好的那个执行上下文函数,执行上下文对象的,其实这个对象不是真实存在的一个对象啊,不是真实存在的一个对象,而是一个虚拟对象,它是一个它。是一片区域啊,是一片区域,这个区域里面呢,有我们的局物变量,有我们的形参,有我们的arguments。都包在这里面。我们说我们前面说过,局部变量和局部的函数放局部的变量放哪里,局部变量存在哪里了。啊,前面不是说过了吗?是不是占了。对不对啊,其实这它会进一步划分,有全局的区域,你调用一个函数,又会为你这个函数分配一片区域。啊,如果我再调用函数了。又分配区域,假设我的函数执行完了会怎么样?
16:03
把这片空间是不是要干呢?是不是释放掉,只有释放掉了以后,是不是才能反复使用。能不懂啊,其实这个对象不是真实存在的啊,并不是完完全全真实存在的一个对象,但是我们可以把它理解成一个对象的感觉去使用啊,把所有的数据都收集起来,放到这个里面来。这一个包裹不是相当一个对象的感觉吗?对吧,但大家要知道啊,对象是放在哪的?对对内存,但你想想看,这个东西有可能放在堆里面吗?不可能嘛,我们说过了,逐变量放哪的在里面的,只是说它这个时候要把某一个函数的逐变量是放在一片区域的,这片区域是封闭的,我外部能看到逐变量吗?我在函数外面能看到函数内部的求变量吗?为什么看不见?
17:05
对,这个地方它是一个封闭的区域,是一个独有的区域。就是我当前函数内部的操作才可见,在函数外部是不可见的。啊,而且还有一个事情也很关键啊,怎么关键的呢,就是当我去我的函数执行完,我才能去执行外部的代码吧。其实当我执行外部代码的时候,那个函数的局部代码还在吗?那个空间还在不在?在吗?不在了,也就是说,譬如说我调用F1函数,接着调用F2函数是吧,F1里面是不是产生了一些逐变量。那我能不能说我在F2里面,我在外,我在这我在这里啊,譬如我在这中间能不能看见F1里面的那些变量。
18:00
啊,我跟你说就不可能看见,即使它不是封闭,你也看不见,为什么?他都不在了,你看啥?因为我们说过了,F函数执行完了以后,那个所有的变量是不是都要消失啊。但是说实话,即使它消失,你也看不见,这个东西是封闭的。为什么要做这个,因为我们要不做这样的事情,我们是不是就容易产生冲突啊?为什么要封闭起来啊?你想啊,你有一个A。什么外面有A?我要不丰富起来,是不是就冲突了,我是不是就把它覆盖掉了,但是真实的是覆盖的效果吗?是吗?不是啊,哪有不盖啊,我外部定义来乘里面的A,我函数里面再定义A可不可以,可以我A外部的A等于一,我内部A等于二,A等于一的那个数据还在不在?来在的原因很简单。
19:06
就是我们的内存空间是隔离的,看没看出来啊,你在你的区域里面,我在我的区域里面,我们相互之间什么不影响。能懂吗?大概要能懂这个事啊,但是我们可以把它看成这里面啊,是个虚拟的。OK,好,这是这样一个事情,大家需要去知道它啊。看到这里啊,再给大家强调一遍,这里面我们讲的两个东西,一个叫全局执行三角纹,它是谁window对吧?那我们去找变量的时候,去全局变量的时候去哪找。
20:02
Window中找。当我那什么时候创创建这个函数,执行上角文。你我要不调用会创建吗?会不会不会你得执行才会创建空间。啊,你要不执行他是不会创建的。但是我们得说,我们在函数体执行之前,它是要全部准备好。对吧,函数体执行之前必须全被执行啊,因为后面是不是就访问了呀,因为我看我访问A1去了嘛,而且你要知道A1去哪找的,刚才我们画的那个图,记住这个图的结构啊,它是有这样一片去单独。给我们的这个函数调用使用。啊,一旦你调用,那我就分配这个空间给你往里面,你去放你的A1,放你的A2,放你的A3,这都可以放。
21:03
能理解吧,啊,这个要能理解才行啊。好,这是我们说的这两个概念啊,一个叫全局执行上行文,一个叫函数执行上行文,其实有了这两个以后,我们其实就能说明。那个变量提升和函数提升到底是怎么回事啊?说白了就是有一个预处理的操作吧。对不对,其实就是这个预处理嘛。啊,OK,这个里面啊,大家一定要把这个给他想清楚啊。行。
我来说两句