00:01
来。啊,这一个就是在H5里面呢,它里面的新的语法里面呢,有一个wework多线程的A,其实这个在实际开发中用的少。只是在面试的时候容易问,那既然面试问,咱也要讲一讲是吧,不讲的话咱就亏了,来,我们来看一下。嗯。好了,我们现在呢,去我们现在去做一个小的一个效果啊。来跟大家把那个页面这个里面页面还没有是吧。我把那个页面写一写。其实非常简单啊。是的吗?哦,写在外,写到里面去了。
01:04
这面呢,我来一个输入框啊,下面呢,我来一个八啊,这个呢叫计算啊,这个里面放什么呢?啊放一个。写个提示啊,就是数值吧,我要做个什么事,我跟大家说一说啊,不过说这东西之前呢,有一个有一个有一个东西,我要先跟大家说一说一个东西。就这样一个东西,我不知道大家知不知道,就非布拉稀数列拉,什么叫非布拉稀数列啊,第一个它开是零,第二个呢是一,第三个是一接一啊,接着下一个,二接着下一个。
02:07
请问下一个是几是人都知是五,他就是当前这一个呢,是前面两个什么和能懂不啊,现在我我讲下我就不要第一个吧,也是一个一个道理,还是一个道一个道理吧,能不能懂啊,能懂我们假设就不要来理了,就这样啊。OK,那小学的时候不经常玩这种填空游戏吗?那这样一个数列呢,我们我们需要去对它进行计算,怎么算呢?是吧,好假设我这个呢,是第一位这个是第二位这个第三位这个第四位这个第五位这个第六位可以吧,各位可以我这个输入框呢,我这一个输入框。
03:03
输入就是第几个值,譬如说我有可能啊打开啊,我打开,譬如我输入一个,我输入一个10什么意思,第十位是多少,我要我要点一下计算是不是算出来。很懂吧,很懂那行,那我们现在就来去做这个事情。来这个做这个事。这里面最最关键的是什么?大家觉得不要做这个事,是读这个值吗?那肯定也不是,是给它减进去吗?也不是就怎么样去能够去设计一个函数。你给它一个值,它能返回那个它所对应位的菲布拉希的那个值,对不对啊,来我们来看一下,我们设设计一个函数吧,我们先试。
04:01
啊,既然它是这个数列,那我就用这个名字吧。但应该写成什么?小写,而我这个地方传入应该是多少D多少位,是不是是吧,那写的什么。呃,第多少位。啊,写个蓝行吧。好,那怎么算呢?最终要返回一个结果,是不是怎么算。拉下。大家看着这看着这归念,我把这归律写一下,我把那个那个数字写一下,一一什么23548对吧,依次往下对不对?好啦,它当前这个数的值是不是等于前两个数的值啊。对不对。真的吧?那你说我该怎么办啊?
05:08
当前这一个的值。等于前两个的值,那用数学表达法是不是FN等于FN减一加上什么FN减二对不对?能懂能懂,但是这个表达式适用于所有的数据吗?适用吗?适不适用不适用?为什么说不适用?因为前两个不适用。主要前两个为什么是,就是因为他们你想想看嘛,你这个地方这么这个表达式必须要求只有三个数。
06:01
是不是啊,能不能懂我,那我就后写,我把这个表达式给大家,给大家写出来啊,大家看看我就写个写N吧,好吧,第多个是不是来看到啊,我写了写了再说好吧,如果N。小于等于二。我的结果呢,是一。也就说白了,如果你N等于一。那是不是返回一是不是?如果你N等于二,是不是返回一是否则呢?你应该返回多少,你不就是应该。加上什么?是不是?这个实际上就是什么呢?递归调用。
07:06
是不是地位啊,什么叫地位调用啊,函数内部调用自己。嗯,第一位调用好,我们先测试一下看看行不行,对吧,先稍微测试一下,看看行还是不行。来团结。传一个,我看看第一个,第二个,第三个,第四个,第五个,第六个就传六个。六的话应该是八是不是是吧,测试一下呗。是吧,好来。啊行行哦,不用写,他直意来了,我还写去了是吧,好下一个应该是是不是13,我们来看一下。
08:05
对不对啊,对的好行,那有了这个函数以后,我这个功能是不是可以做了,来怎么做,这个函数定义好了以后,最大的难题我们已经解决掉了,那下面我们要重做了,先是不是得到一个音input的,要不要得到啊,要好得到这个一步的懂得了DE,那要给他一个什么。是不是给个ID,那写什么呢。对,指定一个ID啊,我就叫就叫就叫名字,真是有时候取名字特别难受啊。那个就就就就吧,好吧好吧。你这个名字好听一点,好,下面我还要给我的这个按钮,什么加监听,也给他一个ID对不对吧,我就叫BT来,那下面我该怎么写did呗,接着了点安克等于半线可以吧,可以,那我在里面干嘛。
09:21
首先我要读取当前这个input的值,作为那个N,对不对,能懂不啊,等于什么input.value这个基本的动作操作大家会吧,好,有了它以后下面干嘛?不叫他穿呗。我是不是可以得到一个结果,这个结果就是调用这个贝布拉西这个函数,把这个number的什么传过去是吧,接着我不C了,我aler行吧,可不可以可以好,这代码都不复杂啊,只要大家能写这个基本上就OK了,下面我们来看一下。
10:08
好,我先写一个九是几来着,34吧,刚刚第八位是多少行啊行,好下面啊,下面我搞一个。搞个多少了,39啊40。嗯。我点了以后,你看他是不是好长时间才返回,好这个还不够,再大一点啊,别带太多了,太多了都没机会了。适当的一个一个值就行,你就点开以后大家看啊,我我我能操作吗?你看我的输入框,我是不是不能输入了。哎,为什么会出现这种现象?
11:01
是不是它不断的在计算,它的主线程不断在运行了,而我的界面在它运行过程中能够操作吗?不能。你看我我就我就我就想改这个四差改不了。能不懂啊这个那我要我要是再加一个,那就时间就更长了。诶,有人说老师就就就这个小计算都花这么长时间吗?主要是你要知道啊,其实递归的效率是比较低的。为什么递归的效率会比较低呢?因为这个里面实际上本质上递归是函数嵌套作用。能懂不?这个占用的内存空间,它的开始我不调一个函数,调函数嘛,假设你把它看成F吧,调FF内部是不是又掉F,它内部是又掉,你去想这个层次特别特别深。能理解不啊,OK,那这个时候就会导致于你的程序运行是比较慢的,因为要花很长时间去做干活。
12:10
那如果你的界面里面想实现这个功能,这个效果什么。也就现在我这个效果可以让用户去使用吗。那明显不可以,人说那这怎么解决?他本来就慢嘛,那能怪我?是慢计算慢,这个是你没办法解决的事情,对吧,但是有一个事情你不能让我不能操作呀。能不能理解,你不能让说我不能让他进行操作,也就在他计算过程中,你的这个里面这个其他位置还是可以操作的,对不对,那现在的情况是什么情况,整个界面能动吗?不能动。啊,整个界面都不能动了,因为你支撑整个界面啊,响应这个界面操作的主线程正在不断的进行计算,所以他没有时间理你。
13:05
那我们怎么办呢?知道吧,那你得想办法将这个长时间的这个计算的操作放在哪个里面去做,分线程在以前是做不到的,但现在呢,可以了。也就web works h5里面提供了一个加script多线程的解决方案。我们可以将一些啊技术量比较大的代码JA web works在分类去运行,这样的话它还会让我的界面冻结吗?知道什么叫冻结吗?说白了就是不响应你的操作了,你你点它,它有反应吗?没有。但是有一个事情需要注意,即使有了它以后啊,OK,这个地方说的是子线程是完全受主线程控制的,关键在这里。
14:06
那个分线能操作作吗?还是不能啊,前面我跟大家提过了,只能是哪个线程操作页面主线程。也就是说,这个新的标准并没有改变GS单线程的本质,只能有一个线程去更新界面啊。好,那我们需要去用它一下,用它一下呢,就其实在涉及到一些使用。来我们我就直接以这个应用为例,来去来去写啊写吧,我们来看一下它是它怎么用的吧,就看他看他说啊,因为这个东西在现实开发中,现在也不怎么用,首先呢,我们要创建一个在分线程执行的JS文件,好,那我创建一个右键六一个JSS文件,那我们得取个名字啊。
15:07
我就叫我点JS吧,名字其实随便取啊,名字是任意的,好继续往下看,在里面啊,需要去写一些代码啊,需要去写代码啊,这个代码呢,我们先不写,我们先把别的呢先写一写。在主线程中,我们向分线程呢,去发一个消息,并设置回调啊,这个说的有点多,我们来看一下啊,来看一下。现在对于我们这个情况,对于我们当前的这个情况,我们要把什么工作交给分先生去处理,是不是这条鱼?对不对,那也就是说我们有主线程,有分线程。这是主线程,这是分线程。对吧,那个主线程里面本身是不是我能得到那个得到那个number。
16:04
这是我主线程得到的number吧,那真正的计算发生在哪个线程?分线程,所以我要做什么事情?将number传递给什么分线程对不对,而分线程干嘛去计算呢,他去计算对不对,好计算完了以后呢。你的分线程要不要把结果这个result实际上是不是在分线程产生的,懂不懂,而这个结果要返回给谁主线程,主线程拿到这个结果是不是可以更新界面去提示。对不对啊,对吧,啊,整个流程就是这样的,那这里面呢,需要去写一些代码啊,写一些代码。好,我们来把这个啊,这个应用就不要了,因为其实就是这个应用,就是应用做了得了。
17:07
我来个啊。来我们来看一下,我先把这些啊,先把这个里面的这些都给它去掉。都该睡了啊。这个是必须得做的吧,这个必须得做好,做完了以后,刚才说过了,应该想办法做什么事情,像这个蓝果。干嘛去,是不是想办法传递给分线程,那怎么传,这个地方有一些API,有些语法需要用啊,OK来。看着,首先它这里面提供了一个新的一个构造函数,叫什么呢?叫work。既然是构造函数嘛,那得怎么办?那也就是说创建一个work对象是吧,Work识别对象怎么创建呢?来这个没问题,另一个work大概是有提示,这是有的。
18:19
能看出来吗?好,这个worker里面大家看看啊,这个里面传一个东西,它传一个什么script ul,实际上找谁去,这个worker是加载谁的,加载那个在分线程里面执行的什么解S,我写个三个路径是不是就可以。因为我们在同一个文件夹里面吗?看懂了吧,好,有了这个work以后,这个worker有些方法啊,这个worker有几个方法,哪些方法呢?我们来看一下,这里面有一个有两个方法可以用,一个叫post message。干嘛呢啊,其实这个名字吧,可能叫圣的麦,你们可能听得懂一点,其实干嘛去发送消息。
19:06
那发给谁呀,是不是向分线程,哎,也就是说我们现在要向啊向分线程发送是吧消息,它的这个方法名叫什么呢?Host message。那里面传什么呢?就是传这个number。对不对,好。刚才大家看到了,我这个主线程除了发消息还要干嘛,是不是还要收那个反馈的结果。能解吧,这个时候我要去注册一个监听。看,On me。On什么意思啊?大家说on click on是什么意思,怎么翻译?当什么什么的时候,你on click,当你点击的时候,我的回调函数被调用是吧?那按message了,当接收到响应消息的候,那我这个函数是不是就会自动会毁掉啊?
20:19
能听懂吗?On是当什么什么的时候?啊好了,这一个可以写在前面,也可以写在什么呢,后面,为什么这异步的这个给我们说过了,你这个无论你写在前面还是写在后面,都必须在它之后啊。能不能理解这个,咱讲完前面的这个应该是好理解的,这个是初始化代码。对不对?而这个回调函数是什么?是不是回调代码?回调代码必须在初始化代码执行后,是不是才有可能执行?能懂不啊,放在前面和放在后面其实都没有什么问题啊。
21:03
好。那我们就先做好准备工作吧,啊,OK,这是干嘛?就是绑定啊,绑定接收。想返回消息啊,接收消息吧的监听怎么办?work.on message,这能随便瞎写吗?不能啊,记住了不能发现好,这个就大家可能不太好。不知道了,这里面有一个对象叫什么呢?而且这个event里面有一个特别的属性叫date。固定的,它设计好了,它设计好了这个里面有一个date,而date就是它返回的数据,那我唯一要做的事情非常简单,就是event date。
22:00
啊,OK,来,我这里面写一个打印输出,这是主线程接收啊分线程啊,分线程返回的数据,数据是多少呢。是不是可以把它打印输出一下,也就是这个什么。event.date能看懂吧?好,而我这里面也写个打印输出,说什么主线程向分线程发送数据,数据是多少呢?也可以把这个number是不是可以打印一下,都看得出来吗?啊,这个也写个冒号吧,好,我们主现成的代码就这写完了。那下面我们要写的是什么呢?分线程的代码,那分层的代码呢,跟这个很类似,但是有点不太一样啊,我们得看看看啊,看那些。
23:13
好,你要写一个这样固定的一些东西啊,这个不能随便瞎写啊,是word,一个on message等于一个方向,其实跟我刚才很类似啊。看得懂吗?有一个event是不是用来接收消息的,你看怎么样得到里面的数据,点什么date好了,最后有一个,诶,这两个方法咱都用了吧。这个post message只是我们前面我们在主线用的时候,都通过谁来用的。是不是都通过work对象啊是吧,你看我们主线程用这两个方法的时候,用这两个东西的时候,不是都是通过主线程通过work对象嘛,但是如果你一旦分线做,你就直接这么写固定的啊,写一个什么呢?A message等于一个方,这里面接收一个event。
24:11
好,这个函数调用说明什么?说明分线接收到主线程发送的发送啊发送的数据,数据是多少呢?我怎么取。也就是说我要选择这个number是吧,怎么去even的?对,那我就把这个number给它输出一下,那下面我要做什么事情,是不是计算呢?我们之所以搞到这里面,是不是为了计算呢?那计算是不是需要有一个方法?对不对,那方法呢,不用再写了吧,先把它拿过来就可以。
25:03
放在这吧,好干嘛?握了一个result,等于拉西传一个。Number。好,接着干嘛。它是不是还有一个方法叫post是固定的啊,等于什么result是吧?啊接着呢,我们再写一条打印输出算什么。分线程向主线程返回数据,数据是多少呢?这不很明显了。好。那。我们现在就来就来,去测验一下,看看行不行是吧,看行不行。
26:08
看一下啊,我们先来个简单的是吧,来个10,这个应该比较快,是不是比较快啊走你。这个属于个吧,是不是主线值55啊,这个值应该对的,我们不要想它啊,大家看到这里,看到这个顺序先是什么,主线程是不是向分线程发送了一个十,那分线程就接收到了什么。主线程发送的数据及是不是接着下面是不是分线程处理啊,处理完以后呢,分线程向主线程返回数据是不是计算以后的结果,那你返回最终主线程干嘛?是不是接收到了分线程返回的数据,这个流程很清楚吧。
27:00
就是我们刚才说的这个流程,一个主线程,一个分线程。我们主线程上面是不是有数字十。对吧?啊,这个是主,这个是分,我把十给他传过去,这传的是十啊,他是不是接收到了十,接着它处理完了以后,结果是以55接着干嘛。他把55返回给是不是主线程,那主线程是不是得到了55进行提示。最简单一个是吧,嗯。好,那下面我们就要说了,刚才是多少不行,点完了42 42已经可以了,是吧?来点能抄的不。能不能是可以,也就是说在他计算的过程中,我的界面能不能跟用户交互可以。是没有问题的。
28:02
啊,就这么个事啊,能懂吗?这个应该是理解起来应该是没有什么太大问题的。但是我也在想啊,我们再想一个事。我们说说一个啥啊,你说我们在全局环境里面,在这个主线程里面认识是谁。认识是谁?是不是window是不是啊,那我现在就问大家了啊,这个不用不用怀疑啊,这个大家都懂,你说这个里面的瑞是谁呢。你说我一上来我就咔一下,打印一下this。是温度吗?是吧?OK,来,我们就来看一下是谁,这东西不看就懂了嘛,这。来按压。啊,随便搞一个阿莎啊走。
29:01
大概首先得说不是我对吧,但是是一个他叫一个什么,叫一个什么。哎呦也多了,他是不是又有一个自己的worker的全局的一个scope这样一个对象,他是一个全击对象,它的一个全击对象,而这样一个全击对象里面有些什么呢?看着啊,这样一个群击对象里面本身来说,诶怎么打不开呀。哦。还不让我打开呢,看到了吗?啊,但是你能看到一些东西啊,打不打开就没关系了,打开它什么意思,它本身是不是有这样一个message,是不是有post message这样一个方法勾掉。对不对,也就是说我们说过了全局对象上面的属性和方法,我是不是直接可以使用。是不是是。
30:01
因为平常我们去问去用的话,大家说我们在全局里面是不是直接可以用document亏门的,你想你为什么能直接用document的,为什么直接用动呢,没用它不是window的属性吗。是不是全局对象的属性可以直接使用,那我现在作为worker它的分析来说,它是不是也有自己的全局对象?是吧,而他全局对象里面是不是有message,有post message我能不能直接使用。能吗?肯定可以啊。我不用去写什么,我我需要去写这个东西吗?我POS么写我我能这么写吗?我能这么写吗?可不可以不可以,他又没有这个,没有这个名称的变量。你怎么随便这么瞎写的,不能这么随便瞎写啊,好,那我问大家啊,说来说去,还是最终是想问另外一个问题。
31:07
什么问题呢?哦,Alert。Result能不能掉?是谁的方法?A,是谁的方法?Window的方法?你说我能掉吗?能还是不能哦。干了不能,这就是说我们我们在主线程里面之所以能掉是因为什么?因为我们是不是全局对象是window,而window上面是不是有个root。对吧,那在分线程里面,我们前面说过分线程不能更新界面,为什么。因为在分线子里面看不到水,看不到温度啊。
32:00
你来看一下啊,我们就写这里好吧,就说这里看他会不会报错还是怎么着。他说什么他说啥?这看不懂吗?Alert is lott,什么DeFine?说白了,这alert的定义了吗?没有,根本就没有,Alert是谁的方法一定要知道啊。不能调用好CL,它不是更新界面的啊,这个记住啊,L卡canl它是浏览器实现的东西,它不是说是这个canl是window的属性吗?啊不是这个开这个是浏览器,每个浏览器都提供了视线啊,跟window没有什么关系啊,记住了跟window是没有关系的,而我们现在要想能更新界面,我们是不是要调用window的方法,或者调用多亏本的方法。
33:15
能懂吧,我们是不是要去能够去操作window或者操作多档,我才能去才能更新界面了,你觉得我现在还有机会更新界面吗?有没有没有,我根本看不见呢,我哪看得见呢,我温都看不见,你觉得我能看见多开门的吗?能不能不能。其实非常简单啊,OK,分线程中的全局对象不再是谁window,所以在分线程中不可能干嘛更新界面。
34:06
你怎么跟天面啊,温都看不见。人说老师他为什么为什么就看不见呢?他故意设计成这样,他就是不希望分线成能看见window。前面我们已经说过了,他这么做啊,现在虽然说我们有了这一个API,它能够帮助我们是不是实现风险权,但是并没有改变一个事实,什么事实呢?就是只有只能有主线程。来更新我的界面这样一个一种事实。分解成那用来干嘛呀。是不是做一些长时间的计算呢,除了这个事,你别的事你都别干啊,你干了也没用,你也干不了啊,就是这样一个事啊,这里面有一个图解。
35:09
这个其实大家一看就能看懂啊。这里面看啊,看它这个左边跟还是说的是我们前面的说的那个情况,看到了吗?这里面是我们的那个。调动了一个站对吧,啊,调了一个站,接着我们这里面是什么,是不是消息队列,也就是我们那个回调队列,我们不断的在干嘛呀。是不是要去路循环取出我们的这个回调函数进行执行呢?这是我们当前主线程的是吧。对不对?好,我们的主线程要想跟分线程,这是一个一个的分线程,一个worker不就是分线程吗。看到吗?啊,要想跟分线通信,我要调用一个什么方法,Post什么message能看到我啊,要调用post message啊,这个箭头是两个方向的,为什么是两个方向的?我的主线程可以通过post message向分线程发消息,那分线程能不能通过message向主线程发消息可以吗?通信嘛,你们相互通信吗?如果就一个方向,肯定是不行的。
36:30
好,那我有没有可能向他发多个消息?有没有可能也有吧,也有可能发多个消息,那他这个地方也是会有一个什么呢?消息队列来存,大家想一个线程在一个时刻是不是只能干一件事情,那我一下子先给上发了十个消息,你觉得他能同时处理吗?不能能不理解,它不能同时处理,它只能是什么一个接一个的处理,那要想一个接一个的处理,是不是先得把所有介绍的消息都存起来呀?
37:12
跟我现在的思想是一样的。能不能理解啊,其实是同样一个思想啊,思想是同样的。这个B跟A是一样的意思。OK啊,那我问大家,你说我们的一个分线程如何接收到主线,主线程发送的数据。通过什么方式接收的?是on message监听吗?它不有一个on message的这样一个一个事件监听吗?记得吧,啊,我们一共就用用了两个方法,一个是按message啊,一个post message,就这两个东西,再为再说有一个东西就even delete。再真就没要了。
38:00
是不是一共就三个三个语法。OK,别的语法呢,我们也不怎么用啊。因为这个呢,到现在为止,基本上在公司的开发中基本上不太用,为什么不用,其实非常简单啊,就是现在啊,现在对于它,因为它是H5里面才提出来一个API,大家想会有什么问题,是不是是所有浏览器都进了吗?不是啊,记住了,这个地方并不是所有浏览器都兼容啊,这个一定要知道,不是所有每一个浏览器都能试用这个新特性。嗯。OK,这个要知道啊,他的一个巨大的一个问题,为什么现在项目里面用的少啊,除了这个问题还有一些别的小问题啊,可以说第一个啊,下面一个。我们在work里面是不能更新动物对吧,是它一个特点,对不对啊,不能更新动,你还要跟人说清楚为什么不能更新动。
39:09
其实非常简单,对吧?它的全局对象不再是谁window,我根本就没有机会操作window里面的数据。你要想更新,不能调到window里面的数据吗?好,这个啊,不能跨域加载GS,估计大家还不知道跨域是什么。啊跨域大家知道啊,每一个每一个网站披多新浪拼多百度,他们是不是都是什么3W点百度点com是吧,啊这就是他的一个域名和一个域,如果我通过百度去喜求新浪叫标花育叫吧叫,那如果我通过我们本地的域名是不是要漏货的。是吧,我们本地的域名叫这个能懂吗?见过吗?不懂。
40:03
就把logo画成了吗?这不是吗?嗯,OK。这是我本地启动服务器访问嘛,啊,但是啊,跟那个跟你直接那看他这种访问方式。跟这种访问方式是不太一样的。我直接打开。你没发现直接打开这么的一个路径,看懂了吗?这是不是一个绝对的本地文件路径?这种路径叫什么路径呢?这种路径叫真实的绝对路径,而这个我们称它为虚拟路径。虚拟路径啊,OK,说白了是真实的路径吗?这哪是真实路径,真实路径不得哪个盘符哪个文件夹下面每一个每一个文件嘛。对吧?啊,而虚拟路径在这这边我们称它为什么。
41:02
这个就是我们的域名。啊,我们的域名,我新浪有新浪的域名,百度有百度的域名,淘宝有淘宝的域名,对不对啊OK。如果大家还不太懂,那后面后面我们会讲啊,其实后面会讲,你先大概知道一下啊,这个东西呢,我们后面会讲。好,再一个他稍微慢一些,也说老师你这你这不说的有问题吗?你刚刚不说那个用的分析能力快吗?这个这个慢是指的是啊,如果我完全全部在主线程计算和我发送到分线程,分线在计算再返回,你说谁快谁慢。你说你说飞行程快,是飞程快吗?不是我们自用它是因为它快吗?不是,那是因为什么?因为它不阻塞主线程对不对,你不冻结界面能理解吧,并不是因为它快,它肯定要慢一点。
42:04
你直接就你想想看嘛,我就在主线上做,和你先发一个消息交给分线成分线来做,做了以后再给你返回,他能快起来不可能。能理解吧,他多少要慢一些,但是你想一个是慢一点,但是他慢一点吧,他能不冻结主冻结你的界面,那用户希望什么,肯定希望,即使你慢一点也没关系,是吧,慢点他以为是网络慢没关系,慢一点。那至少我还能操作吗,是不是。没出问题就行,你至少保证用户的操作啊,是可以操作的,你不要搞得用户一点,就是说懂不懂啊,挂了得了。这种用户心理大家应该还是能够理解的啊。
43:01
其他的就没有什么了啊啊现这一次呢,我们就直接用这个练习,这个练习就是我们刚才这个练习啊,没什么别的啊,就是我们这个练习。行,大家唯一要做的就是把我这个,一个是要理解它的优点,再一个就是把这个给它做出来就行啊,啊其实代码没有句号啊,他把代码写一写就行,其他的就没有什么啊。
我来说两句