00:00
那我们先还是来把昨天我们讲的东西来复习一下。不过我还是先要找同学回答问题啊。第一个问题。弟问,你需要我问吗?应该知道什么问题是吧?找个找一个女孩子。那个李牧师啊,你是男孩子,没关系啊,状。的什么那个,嗯,还有一个没讲,嗯,对,第二坐下来吧。
01:10
李牧师这个名字很秀气啊。好来啊,昨天呢,我们首先去讲的是函数高级的两个部分,一个是叫中域,中域列。啊,一个叫必包啊,那我首先要再找个同学来回答一下,那个你简单的说一下什么叫装玉中玉链啊。我都不敢说是男的女的。姚斌。就是那个,幸亏没说女的。嗯。
02:02
一个变量,他呃。一个全局,全局部存在,这接是吧。那什么叫专用店?就是。自现在只是个费用预选种。如果没有的话就。线什么线上,线上什么意思。去外面一层。嗯,那外面没有了。一直往上走,嗯,行差不多啊。嗯,这里面呢,首先大家还是要去能够知道什么叫作用域,作用域链啊这两个概念,所说的作用域呢,其实就是简单来说就是一块代码区域,但只是这个区域呢,我们可以分为全局的区域和。
03:04
是不是函数的区域啊啊,OK,那全局区域指的是不是我们的script的标签夹在那个区域。那函数区域,也就是说我定义函数那个大括号是不是管理区域,了解吧,那撞域的它的作用是什么?是不是隔离变量啊,啊,其实也非常简单啊,它用来去隔离变量,那为啥隔离变量啊。隔离变量有什么好处啊?我们可以在不同的作用域里面去定义什么相同名称的变量而不冲突。能不能演好,那有了状欲以后,后面要用到一个概念,叫坐欲念状用力念,很简单,首先要有作用玉的嵌套,能不能理解,就是用作用玉是可以嵌套的吧。
04:03
啊,譬如说我只要定义函数就有作用域嵌套了,对不对,因为首先一上来有一个全局作用域嘛,对吧,全局作用肯定有的吧,那接着只要我定义函数,我这个函数是不是在全局作用域里面。啊,那我的函数里面是不是有可能还定义函数,这是可以的对不对,既然是支持这种语法,就别的语言是不支持的,加二就不支持。你函数里面不能再定义函数的,它就可以。那中域链它就是我们嵌套的中域由内向外的一个结构吧,能不能懂,那它用来干嘛呢?我们前面说那个作用域,它的作用是不是隔离变量啊,那我们作用链用的干嘛呀?查找变量这个非常关键,查找变量也就是说我举个例子,我去输出C,我是不是去找这个变量啊,那找是沿着什么找中链来找。
05:12
中位链是不是由内向外,或者由由下之上的一个结构啊。啊,这里面啊,就要说一个事,如果找到了自然就返回,如果找不到了,是不是我们就要报错呀,能不能懂,那我们找变量呢,是沿着作用域链找,那如果我找一个,比如说a.B。A是演的什么枣?这些训练。找A是圆的圆形电呢?这个A是个什么呀?A是个变量啊。能不能懂A现在只是一个变量,我现在是不是沿着作用链来去找A呀,找到A以后得确保A是一个对象,接着我去对象中是不是去找它的对应的属性B呀,那现在也是怎么找,是不是A所对应的那个对象的圆形链上去找啊?
06:18
你就把这个给我记住啊,它们之间区别就是我怎么样找到a.B的,这a.B怎么查找,其实两个查找方式是不是都用了,先是找作业链,那找不到就干嘛。还还要看下面吗?如果找不到是不是报错了呀?好吧,那下面我找到A以后,我是不是继续找B呀,找B是现在是不是找对象属性了,不是找变量了吧,不是单纯的找变量而找对象属性,那此时是沿着什么原形面来查找,找不到怎么办?返回find。
07:03
就这个模式,你给他以这个例子为例来说明这个问题就可以了。好,那我在全局里面,我假设啊,我我去找window.a。会怎么样呢?我假设没有定义,全局变A,我window顶A,懂为什么?那如果我直接找A呢?会怎么样报错?看得出区别吧,我们平成能说你就直接找,直接写A,是不是相当于写window.a啊,但有没有一点区别,有没有,有就是看找不到以后他怎么处理,能懂吗?他一个找不到是报错,一个找不到是返回案find的呀。啊,这些小的细节是比较容易考到的。
08:06
好,还有一个事情,大家应该知道作用是什么时候确定的,是不是代码一书写以后就确定的,还会变化吗?不会,那作用到底有多少个呢?N加一个N是什么?定义了多少个函数?一是什么?是不是全局中域啊?我们前面说过那个执行上下文是不是也是N加一啊?N是什么?是不是我执行函数调用函数的次数啊?一还是我这个全局的对不对,能不能懂,你看啊,总结规律,你为什么说那个国家领导人上台以后,最后过过个几年都要拿出一个口号出来,你没有口号怎么能统领大家了,对不对啊,大家喊口号的时候也喊,喊得起一点。
09:06
好,这里面大家一定要区别作用域与执行上下文,执行上文是不是动态产生的,执行上下文是动态上,尤其是函数执行上下纹,它会一直存在吗?不会什么时候产生?调用函数的产生,什么叫死亡函数执行完它是不是就死亡了呀?能理解吧,啊,要能区别开来啊。其实关于中运,中运练呢,会有一些啊面试题啊,这些题呢,是比较具有迷惑性的。大家要注意。啊,我们在查找一个变量值,找的是作用链对不对,而作用用链是不是根据我的这个代码定义的位置来去确定的,跟调用位置有关系吗?没有,也就是说我去找这个X。
10:00
我找不到,我是不去外部找。而它的外部和内部这种这种相互之间的关系,是不是在定义代码的时候就确定了,而跟执行哪个位置调动没有一点关系。能不能理解啊,这个要能理解才行啊。OK,这个也是,这个也是容易经常容易犯错误的地方。就我们去啊,打印输出F2会不会找他。会不会不会这一个在哪个里面,是不是在对象内部啊,我要想去找到FR,我必须通过对象去引用它吧,那要想用对象引用差有两种方式,一种用什么OE节点可不可以可以,但是我们更加动态的可以用什么Z点。能不能理解,那如果我没有去写认识点,我就这么写的,遵循的是什么?
11:04
是不是做运链的查找,那做运链查找这个时候找得到吗?找不到,但上面这个找到吗?找到吗的外部全局中域里面不有这个FM吗?对不对啊,这个要能搞清楚。啊,其实你搞搞清楚了,非常简单,一个事情也不需要你记。因为你理解了,就说知道了。啊,如果你没有理解你靠背的你两天以后你就全忘了。啊,这说的是啊,作用运与作用运念啊,其实现在看来是并不太难啊,因为前面呢,我们有了很多基础了,学习来了没有多大难度啊,后一个呢,叫避包啊,我先来找一个人说一说啊,什么事必包。我也找不到一个女的。
12:02
已经。一。你说一下什么叫。是这样。或者是。你说的币包是个什么东西啊?函数嵌套的内函数引用外部函数的数据或者是变量。嗯,那你那你简单说一下那个你说的这个事情必包最终是什么东西。啊,或者说他什么东西都不是。就你刚刚这描述没有最终的一个,我听没有听出来最终的一个到底定位在主语是谁。就主语到底是一个什么样的东西,你在描述的是一个过程,描述的是一个现象,你最终的主语。主体是什么东?到底是个什么东西?
13:01
就函数签到就是B包,然后那是产生的B包。你现在说的这个现象,就是我们说的是产生必包的两个条件嘛,对吧,那就产生了B包,那现在啊,这个没问题啊,这这一点是没问题的,那那到底B包是什么呢。你要是那个引用变量的对象,被引用变量的对象。被引用被变量的对象,那它在哪呢?哪个函数内部外部函数内部内部函数内部,嗯,行。啊,关于B包呢,这里面我们去说了很多啊,说了很多相关的一些东西啊,最先呢,我们讲B包的时候,最先我们是不是讲了一个循环便利加监听的一个例子,还记不记得那个例子呢,是经常在面试中容易被提起的,就问你啊,B包是什么,你有没有用过B包?
14:11
这个我我当时后来没给大家回过来看,我们来看一下我们这里面有没有币包。大家看一下有B包吗?有没有有,首先啊,其实找配方非常容易,先找函数见到。这是一个函数是吧?啊里面又是一个函数。对不对,接着找内部函数有没有引用外部函数的逐变量是有没有哪个I,这个I是不是引用了它的这个行差I呀,形参是不是局部变量是不是是的。
15:01
没问题吧,啊OK,那现在就要想的啊B包啊,我们说过了这个为什么,就是我们说过每每一个八相当于都能看到自己的生下标啊,为啥呢?我好,我问这个问题,我下换一个问题,请问整个过程中产生了几个密包?是一个还是多个解说?非两个。是一个还是多个?嗯,怎么看是多是一个还是多个,怎么看B包产生的个数的,我们说怎么看B包产生的个数,就看外部函数被调用了什么几次,你说外部函数是调用一次还是多次,多次那不就得了,那就多个B包。其实很简单,因为我们现在是不是要保存多个A子啊,我是要保存012,我有三个按按钮嘛,对不对,能不能懂啊,我要保存012,而这个地方我们传进去的这个这个I的值是不是就是分别是012呀,对不对,我这每这一个每传一个I值,是不是就调用了这个外部函数。
16:21
跟Y函数是不是就产生了一个B包是吧?而每一个B包是不是都被保存下来了?那他们是要各自保存自己的I值,而不像以前,以前之所以出问题,默出问题是因为什么,他是不是只有一个I呀,只有一个I值啊,而最后读到的是不是最终的这个值能不懂,而我们现在是不是变化了?是吧,能不能看出来呀。啊,OK,我们调用多次这个外部函数,产生了三个B包,产生了三个B包,而每一个B包里面的属性名叫什么?
17:05
属性名I嘛,只是I的值是不是不一样,能不能懂一个是I等于零,I等于E和I等于什么等于二。能看到吧,好,接着我们I等于零的时候,是不是对应的是第一个button对不对,说白了,每一个按钮,每一个button是不是用的自己自己背包里面的那个I子是不是是啊。啊,这个需要去搞清楚。啊,这个名字一定要叫A嘛,我能不能换别的,我表示我换个街行不行可以吧?啊,我想后街,那你说我的币包里面的那个属性名叫什么,是叫J还是叫I。哎,这个要搞清楚了,是I阶解嘛,你你就要看内部函数引用外部函数那个变量名叫什么,不叫接吗。
18:07
是吧?看。好,那我问大家啊,我再问大家一句,你说这个B包为什么没释放啊。开始的时候,是什么原因导致他没有释放呢?对吧,你以前我们是不是通过一个外部,外部变量引用的那个内盘数,我们不是前面做了一个事情,摸了一个F。等于放一等于FN1括号嘛,是吧,我们是通过F引用的那个内部的那个函数是不是啊,那现在呢。现在我我我我没释放的原因是什么?以前是因为F在,所以导致它执行完了一直没释放,对不对,那我现在这个函数执行完了以后,为什么那个B包为什么不释放呢函数。
19:04
内部函数被谁引用的,你就看嘛,这不内部函数吗?内部函数被引用的。不知道啊,这都看不出来内部函数被谁引用着,被安肯定不能这么说,你就说被被这个按钮引用着。按钮对象,它的对象是不是有一个属性等于这个函数,我这个安克是不是一个属性,而这个属性是个引用变量属性嘛,它指向的是是个函数,能不能看出来。能不能呢,啊,OK。我跟大家说,这个东西一直不会消失。你是不是把那个当把这个属性,把这个内部函数。关联到按钮上面去了,按钮在页面关闭之前是不可能释放的吗?那按钮不释放,你觉得这个闭包的里面的东西会释放吗?会不会不会。
20:08
那你说那波泄漏了嘛,那关键是你要看看你这个按钮,你的事件你是不是一直能响应啊,你要一直能响应,那你就不能释放,你要释放了,那不就完蛋了吗。能不能懂,你想想看,我的页面里面的某一个按钮的功能,是不是一直都需要在那一直都需要在,是不是一直关联着你的那个B包能吃饭吗?应该释放吗?不应该,除非说我这个按钮啊,现在视线不用响应了,那你说我该怎么办?我现在我的那个我的那个事件不用响应了,你看你说我该怎么办,非常简单嘛,就是BTN点安等于什么那。你不指向他了,他不就释放了吗?
21:02
能不能理解啊,这个要理解啊,这些东西真的是一些一些非常核心非常基本的一些概念。我希望大家通过这几天的学习,能够对语言,对JS语言呢有一个更加彻底的认识。啊,不仅是就学这些知识本身,而是对这个语言的语法,它的一些思想有一个更加深入的认识,这才是最重要的。啊,这是我们说的引路,其实我们现在是不是就利用B包啊,因为我们说B包的作用是什么。是不是延长了这个竹变的生命周期呀,就让它一直存活着呀,这挺有用的啊,好。后面呢,我们说到理解必包,其实理解必包有一个,第一个要跟别人说的就是怎么样产生必包是吧,你要描述一下这个过程。啊,其实很简单,就是有一个嵌套的函数,也就外部函数和内部函数呗,是吧?而内部函数引用了什么?外部函数的局部变量,这个变量可不可以是函数可以,因为函数是特别的变量嘛。
22:11
能不能理解啊,OK,但是其实还有一个条件,你得必须去调用那个外部函数。也就是说,如果外部函数不调用有意义吗?没有,但是需必须要调内部函数吗?不需要,也就是说我没有调用内部函数之前,B包是不是就产生了,那B包到底什么时候产生了,就是内部函数对象,它其实函数也是个对象啊,内部函数对象被创建的时候是不是就可以,那现在就是什么时候创建了是吧?其实就说白了,你只要把函数定义出来是不是就可以,就看函数什么时候真正已经定义了,能不能理解,只是这个定义有可能被提升,也可能不提升。
23:00
对不对?什么时候被提升?如果我用函数生命的方式去定义函数,它就会被提升。那真正函数对象是不是比我定义的语句的位置要早一点,能懂不?那如果我是用函数表达式的方式去定义函数的,它会提升吗?不会,那不会的话,是不是只有当你的程序执行到我的那个语句的位置,是不是才会真正的创建好对象?这种区别大家应该能区别开来啊。啊,同时呢,我们也对函数提升呢,有一个更加彻底的认识。这个大家需要去知道,而且我们最终说到一个事情,B包本质上它就是一个对象。对吧,你跟他描述,你看怎么说啊,你你连着说一句话可能有点费劲,你可以先说他是个对象,那是什么样对象呢?在哪呢?是吧,OK,是保存在内部函数中的一个对象,那那个对象里面有什么呢。
24:12
是不是有我刚才说的那个变量啊,被引用那个变量啊,能不能懂啊。啊,你在跟人说的时候啊,想表达一个意思,怎么表达?有两种方式,一种是说一段非常长的句子。但这个一个是对你的要求比较高,再一个别人听的也不是不一定特别清楚。这个很正常,大家表了他跟人说的时候,不也是有可能这样吗?你说很长一段话,别人不一定能完全清楚,对不对,你要把你那那句话进行分解,怎么个分解法,先说重要的。重要的就是什么,他是个对象。是不是,那下面你就要描述了,它是一个什么样的对象了,它有什么样的特点,它存在了,这不都它特点嘛,对不对啊,它存在我的内部函数中。
25:03
那它里面保存的是什么呢?既然对象保存的什么呢?对不对,保存了被引用的变量。这没问题吧,没问题,但是这个时候啊,你说这个时候这句话的时候,可能那个面试官就不太认。那你该怎么办?那你就怼他是吧?你说怎么办?你说我就没办法了是吧?啊OK,你想嘛,你要你要你要说你的你你之所以不认同你是因为你没有你你是不是权威知道吧,你就是一个,你就是一个找工作程序员,他他还甚至怀疑你这个,你这哥们是不是很菜是吧,你说的话他都他不相信很正常对不对,你得说我是通过查看Chrome调试工具来看到了。
26:06
那这个时候他就他再说什么也不好说了吧。这是这个套路是不是有点深呢?这里面啊,大家如果说这块图片上,你一定要把Chrome的调试工具给他搬出来啊,跟他去交流啊。这样其实说这个事情同时也能让别人知道你是会调试的啊,你不是一个初级程序员,你是一个会调试的程序员,你说会调试的程序员是个什么水平啊,至少比初级程序员要要好一点啊。其实说很多话啊,其实跟大家说,你在面试的时候,有的人会表达同学能通过各种各样的方式向他证明我是有工作经验的,我的能力很强,但是不是说我就跟他说我能力很强啊,你要不要我,我能力很强不是这么高的,而是你说各种各样的话里面都透着一股杀气啊。
27:13
嗯。啊,这个产生秘方条件也跟大家说过了啊,没什么啊,OK啊,这一个是比较关键的啊,跟大家说一下也是什么意思呢,你去面试怎么成功,你至少有些点是勉强的。比别人要回答的好。而必包的这个点,我相信大家只要是把我们讲过的东西好好的整一下,肯定是比别人要强。啊,这里面呢,会说一些常见的一些必包,一个是将函数作为另外函数的返回值,这个非常常用。我们函数有嵌套吗?对吧,我们刚刚说了在内部是不是不用执行那个内部函数啊,只要把那个函函数给他什么返回,为什么要返回那函数了。
28:00
是不是你在想啊,内部函数可不可以超过那个逐变量。各位你想想看,我们最终的目标是什么?这个OK,这是一个函数,这是一个函数,我在这里面是不是定义了一个变量啊,对不对啊,现在我在这个函数里能不能操作A,可以可以,我可以去A加加假设就代表操作A吧,啊,我就可以操作A,我在这个这片区域里面我能看到A吗?不能,我看不到A,那我就不能操作A吧,那怎么样,我能想办法操作A了,是不是把操作A的这个法函数给的什么暴露出去,怎么暴露出去啊,Return。是不是就能暴露出去,那暴露出去以后,我是不是就可以操作了,能不能操作了人这是一种思想。也是我们必包的一个非常重要的一个应用。
29:02
啊,这个得知道啊,再一个经常会将一个函数作为时差传递个另外函数,因为你想啊,我们最终是不是要有函数嵌套才能实现必包啊,你得想这两个函数嵌套才能产生密保,怎么样的语法才能产生函数嵌套啊,这是有意义的啊。OK,这是这一个下面第八的作用,我们说过了几个作用。两个第一个是什么?延长逐变量的生命周期?那本来他应该什么时候死,是不是函数执行完他就要死了,但是B包产生以后,只有函数性官他死了吗?没有,那相当于就延长他的生命周期呗。第二个事情。作用是什么?从外部可以操作什么,内部函数内部的主运量是不是,但是这个什么间接操作肯定没法直接操作。
30:09
等于说老师什么叫直接操作,直接操作就是我看到这个变量啊,我对这个变量的数据进行操作,可不可以,这才叫直接操作,能不能理解,但我明显不行,因为它是主变量,没法直接操作。这个大家应该清楚好了,B包,B包的生命周期这个好多,首先什么时候产生。什么时候产生一个新的撞域的那个必包对象,整体来说如果充电说话,是不是执行外部函数啊,就会产生对不对?但这个是不是说的有点范围太宽了呀,如果说的准确点,应该在什么时候,精确的时候,是不是内部函数对象被创建的时候,是不是就会产生。那首先啊,你得满足那个产生那个就是条件对不对,也就是说如果我的内部函数没有引用外部函数的变量,有地方吗?没有,那就没意义了,对不对,首先你得满足条件,再说什么时刻。
31:13
能不能理解啊,OK,就是内部函数对象被创建的时候。那什么时候死亡呢?16、死亡,内部函数成为垃圾对象的时候就会死亡。诶,那我问大家,我有没有可能说外部函数一执行完,内部函数就成为垃圾对象。可不可能假设我Y排除掉FAE为括号执行,执行完以后。我有没有可能那个内函数就成为垃圾对象了?有没有可能有,只要我不用变量来接收它的返回值,那它就是成为垃圾对象了。能不能理解啊,我们说过了嘛,这个地方就是因为有F来接受它嘛,对不对。
32:04
那现在说了,我要想让他们死亡怎么办?是不是等于浪啊?能理解吧,啊,F等于让它就会死亡啊,那内部函数对象死亡了,那B包是不是就会消失啊,啊这个要搞清楚好了,后面呢,我们利用B包去定义自定义JS模块,那这个地方就要问了,什么是JS模块。还是我刚才跟大家说的啊,要描述它呢,有很多句话是吧,先说一句简单的。一根本的话,其实一个JS模块就是一个什么JS文件,对啊,说任何东西,先说最根本的啊,用最简单的语言来表达,再慢慢的描述。它本质上就是一个JS文件,但同时它要具有一定的特点。
33:00
啊,它要具有一定特点,我的这个JS文件肯定实现特定功能,这个没什么对不对,肯定要实现某个功能的,那它还有一些啊,需要注意的地方就是我们需要将所有的数据和功能封装成一个函数内部,封装函数内部也就说白了,我们是不是要将我的实线包起来呀。一个功能,大家想一个功能,一个功能得有些什么东西啊,它内部是不是有自己的数据有没有,是不是还有可能有啊啊假设有个数据A啊,随便来个三。下面还有一些什么,除了这个数据。还有操作数据的行为吧,要不要啊,有工人嘛,工人做什么事情的?你想想看,你光有数据没有行为,有意义吗?没有意义。能不能理解功能,你要你要去想啊,一个功能它不得有一定的行为吗。
34:04
你再去定义一个对象的时候,你不也去定义属性和方法吗?对不对,能懂不?而属性是不是就是数存储数据的方法,用来干嘛呢?操作属性数据的。你看嘛,我有内部,内部里面是不是存了数据。是不是啊,我是有set用干嘛呢。是不是修改我的内那个内部属性的。是不是操作数据的是还是不是啊是,譬如说我可不可以写get name,那get name是返回内呀,他是不是在操作那个内部属性是。是这个操作可以读,可以什么写操作嘛。写是操作,你读它也是操作。你要通过我们这学习,对这个语言的一些特性有一个更加深入的理解,而不仅仅停留在语法上面,你不能完完全全就停留在语法上面,而是对他的思想,对他的设计。
35:16
啊,有一个更好的认识。因为这些东西通用的,你把这个语言学会了,你去学别的语言,它也差不多。那如果你只停留在语法上面,我告诉你,你学别的语言,那个语法是不太一样对吧,你不同的语言语法是不一样的。但他们很多的思想是一样的,那如果你能学会一些思想的话,那你基本上学别的语言也简单啊。好,除了我的这个我的这个这个GS拈,除了这个属性数据,应该还有一些操作这个属性数据的一些方法。是吧,P说test随便搞一个啊,一个函数是不是都是操作一些数据的一些语句的一个封装体啊。
36:04
啊,这个应该要知道才行啊,好,那光就这样就够了吗?这些东西我外部是不是都不可见呢?那不遮不可见,那我得怎么办呢?是不是向外暴露一些我想暴露的行为,譬如说我定义了十个行为,那我一定要将这十个行为全部暴露出去吗?不一定,我可能只需要暴露两个。能不能理解有八个了,我自己内部用可不可以可以。啊,好看。这会很简单,你就去你就去想啊,你去银行办业务是吧,那个银行的窗口里面是。是不是只为你提供几种服务啊,但是他们的功能其实很多,对不对,他们的功能啊,也可能内部在用,也可能针对的是是那些什么送钞票的。那些人对不对?你想啊,这个地方我的行为并不是要所有的行为都要向外暴露对不对,这个能理解吧,啊,并不是我所有的行为都需要向外暴露。
37:14
因为有的行为是我自己内部用。你说内部为什么还要定义函数呢?复用啊,你定义的函数是不是就可以反复用,能不能理解这个一定要理解啊,你这些东西非常有用的。啊,我向外暴露啊,一些我想暴露的行为,那如果我想暴露一个行为,我返回什么。是返回函数啊,能不能懂我就暴露一个行为,那就返回一个函数就可以。行为不就函数吗?那我想暴露多个行为呢对象。能不能?啊,OK,那大家要去说GS模块是什么,需要去说到这三个。
38:08
那啊,这三个有了以后,我就是个我用的人怎么用啊,我的页面里面怎么用,首先第一步干嘛。我要用这个接什么块。是不是引入这个JS文件,能不能懂,接着我要想办法得到什么。是不是得到那个它暴露的那个模块啊,它不暴露了对象或者函数吗?能不能懂。啊,可能我就直接可以得到了,就已经看到了,对不对,也有可能我是不是要执行一个函数才能得到,那看我们是怎么定义的对不对,我们那时候定义模块是不是用了两种方式,一种是定义一个函数里面return一个什么对象,是吧,那你要想得到这个return的对象,你必须先执行这个函数嘛。
39:01
对不对,对,这是一种方式,还有一种方式是我们用的什么语法,用的匿名函数自调用,也就是I fe的方式,对不对,我们是不是给window添加了一个属性,还记得吧。有人说,老师你为什么不还要放到一个IE里面去呢?为什么不直接写window度点呢?这个一定要明白,我再跟大家过来看一下。哎,这个也就是说什么意思,为什么这么做。嗯。这不就好了吗?这能好吗?好吧,我们刚才说了一个模块要具有什么特点呢?是不是隐藏那个数据和操作数据的行为,是不是最先是要是隐藏的呀,你这么做隐藏的吗?没有,你这么写着还需要暴露个啥,你全部都暴露出来了。
40:09
能不能懂你就这么写的,你没有必要加它了,你还加它干啥,你这两个函数,你包括你的数据是不是都暴露在外面了,是吧啊。所以我们的GS模块它会有一些特点,这些特点是大家必须得知道的。你把今天我讲的这个模块的这个特点学会了,你到时候后面再学别的语言啊,我们后面会讲别的语法也用到这一点啊,OK,这是这个大家需要去知道的。啊,这个缺点,这B包的缺点还记得吧,实际上啊,本来以前是优点的,现在已经又说成缺点了,就当我不需要那个B包的时候,那个B包是不是一直都存在啊,怎么样让它不存在啊,40方说白了就F等于long是吧?啊,F等于二好了,那有一个概念,就产生了一个新的概念叫内存泄露。
41:10
对吧,其实内存泄漏有另外一个量叫什么。内存溢出。这里面有两个概念是大家必须需要去懂的,一个叫内存溢出,非常简单,就是你要的内存已经超过了什么,剩余的内存那就溢出了,懂不懂啊,那人说有可能就是说让你写一段内存溢出的程序,应该怎么写?是吧,你该怎么写,你该怎么怎么跟描述啊,这个东西啊,不一定用笔,就说你拿着笔来,我来给你写才行,他可能就说你能不能大概说一说,那个代码大概怎么写。其实非常简单,一句话,就是不断的创建数组。有人说老师是不是只能创建数组才能搞内存因素啊,不是主要是创建数组啊,我能指定那个的那个元素个数大小。
42:07
我一下子就能分配很大,需要很大一个内存,懂不懂你要创建一个对象,那这就不好整了。能不能懂啊,你创建个对象,没办法让那个对象一下子特别大,你说老师我写很多属性,他会不会看得大,当然可以,那你写1000个1万个,你试试。能不懂我的意思啊?OK,而内存溢出它实际上是一个运行的错误吧,你就出错了,出错了以后我的程序还能正常运行吗?不能,那内存泄露是什么呢?说白了就是你占用这个内存,你的数据我已经不用了,知道吧,你这个数据也不用了,我不用它了,但是你还不释放。对不对,白白占用着。那内存泄露到一定的程度,就可能导致什么内存溢出,内存泄露有一些常见内存泄露,这个是大家要记住了啊。
43:08
这里面给大家总结了三个,一个是意外的什么呢?全局变量,什么叫意外的全局变量?你不用握去声明全局变量,本来声明局部变量,这还是局部变量,懂不懂,本来局部变量不在函数之间完全消失吗?对不对?不用握去定义局部变量。啊,这个要搞清楚,下面一个没有及时的清理我的计时器,或者是回调函数。啊。最后一个就是我们今天讲的什么地包。啊,这是一些我跟大家说啊,我还是要跟大家说一下,你面试的时候怎么成功,你要多准备一些点。他一问,你就启动那个开关,咔,就开始给他回答。
44:02
嗯。好,这里面我们说的是函数高级相关的东西,那后面呢,我们去说啊,说了一些对象高级相关的,其实这个比较简单,说实话啊,这个比较简单,我就在这里给大家看啊,讲两个点,第一个点是对象创建的模式,那对象创建的模式呢,这里面有好几种啊,第一种是object的构造函数模式,就先创建空对项。哎,我除了这种写法,还有别的写法吗?是六一个OB是不是,那六一个OB和它这种是不是更简单的本质是一样的,懂不懂本质是一样的啊,那这种模式它有什么样的缺点。是不是语句太多呀,即使对于创建一个对象来说,是不是语句太多,那我要创建多个对象,重复重复重复一样重复。
45:03
对吧,那我们怎么样解决创建对象太多的问题了。是不是用这种方式,这不是一创建对象的时候,是不是直接就指定了我们现在几条语句了一条,而上面是几条三条,也就说三条和一条也相差就两条啊。我要说个极限,我要1万个属性啊,能不能懂啊,我要属性多了,是不是就你有你有N个属性,是不是多了N条啊,能理解吧,嗯,那好了,那什么时候用第一种方式,怎么用第二种方式呢。就是我第一种方式是我要创建一个对象,但是呢,我开始的那个属性数据吧,我开始是吗?不确定,那我就用第一种方式,那如果我是确定的,我就用什么第二种方式,这种我看出的是创建一个对象。能理解吧,那现在我要创建多个对象,还适不适合,不适合,那不适合用什么方式呢?这个地方我们后面我们开始说过,是不是工厂模式啊,那工厂模式我跟大家说过了,其实不太用啊,其实一般不太用啊,只是我要通过这个例子告诉大家,工厂函数是一个什么样的函数,什么样函数工函数。
46:21
返回一个新的对象的时候,就每一次调用它都会返回一个新的对象。各位,这个比较简单啊,真正用的时候我们会用什么构造函数模式,这样的话我创建多个立项是不是非常轻松呢?一条语句,我就能创作出来一个对象,一条语句我又能创建出来一个对象。简化了吧,但这一种模式有个什么问题,这种模式很简单,是不是方法,每一个对象里面都有方法呀,而这些方法是不是一样的?那所以我们最终想到了最好的方式是组合模式,对不对?那也就是说把方法放哪去圆形中去,那就是说我六出来两个实例对象方法有几份?
47:16
方法有几份,一份就大家公用的。能理解吧啊,公用的这个记住啊好啊,这是说的是我们对象的创建模式,其实对象的创建模式呢,还有别的模式,还有别的方式,但是呢,现在我们暂时就不讲了啊,后面我们遇到了再讲。啊,后面呢,还有一个概念叫继承模式。这个继承模式呢,我们说了啊,说了这几种,首先第一种叫圆形链继承,他为了得到是什么方法,关键的一条语句。就是什么。我们的子类型的圆型指向什么?说一句话,你要说到把这句话说准确了,对子类型的原型,子向父类型的实力,其实还有一个要写的是吧,还一个要修正的啊,就是点pro type,点等于七,这个是最好要写一写。
48:31
也就其实不写的不会影响到我们的方法调用,但是如果我不写这个,看三板指向谁。指向的是个呀。能理解吧,指向拍呢,这个就不太好了。能理解吧?好,那这种方式呢,主要是我们的实例马上是不是就能访问副类型的上面圆上面的方法可以访问吧,可以,但这种呢,这种模式呢,对于啊,它我们来说,下面一种叫借用构造函数,它是为了得到什么属性,那这里面有一个非常关键的一条话,这个。
49:15
就括谁来括,是不是负类型的函构成函数点括,括的时候指定谁Z,这个this是谁啊?是不是指类型的实例?能不能懂这个this是不是指类型的实例?能理解吧,其实这句话啊,这句话说实话,不写它行不行,那不写它我应该怎么写,就日意时间叉叉等于什么叉叉叉是吧?啊,等于说你这两句话都一样啊。那我要多个属性呢,是不是就不一样了,譬如说我要我的副类型有五个属性,有没有可能有吧,我副带星有五个属性啊,子类性呢,有六个属性,那是不是就多了一个,那那个五个我是不是要正常写,是不是要写五条语句。
50:08
那如果我用括的话,写几条语句,一条就写这个作用,其实说你没有别的啊。啊,这么整了以后,我创建出来的实例是不是可以去调用这些属性数据了,可以吧,可以啊,其实我们要说到这一个是真实性的继承的效果吗?没有什么继承。但它有用啊,我们在说的时候会说这种方式叫借用构造函数啊,最后我们用什么呢?组合的方式,也就说白了,两种语法都用是吧,再去初始化属性数据的时候,我们是不是使用扩呀啊在我们的去。指定原型的时候,我们在里面给我们的指类型,指定原型为父类型的什么实力啊,这个要知道啊。
51:06
啊,这里面还有一个你一个对象背后做了一个什么事情,其实这个这个我们说过了啊,首先要创新去空对象嘛。是吧,我们要超级空下,接着给对象是不是设置什么属性,我们说六对象内部是不是有有一条有一个方有一条语句啊还记得不有一条语句就是this.pro下划线等于。我假设那个那个函数名叫FNFN点什么type是这样的吧,啊,有这样一条语句。那接着搞完以后才去执行什么函数题,OK。而在执行函数间,那函数里的this是我刚才创建的这个对象啊。Any。啊,这一个大家需要去把把我们讲的这两个概念啊,其实这个难度不算特别大,嗯,知识也不算特别多,好这样我们就把我们前面啊说的一些对象的模式和函数高级相关的一些东西都跟大家说了说。
52:12
啊,难的问题都过去了,我不知道大家这几天是不是感觉自己突飞猛进啊,感觉自己好像那个身上都发光了感觉。
我来说两句