00:00
Hello,大家好,我是风雨,那么欢迎来到我们ES6的这个系列教程,然后我们这节课呢,来讨论一下我们这个S6声明变量的这个命令,那么在说ES6之前呢,我们可以先来回顾一下ES5声明变量它使用的这个蛙命令啊,那么在ES5里边生命变量的命令呢,有两个,第一个呢是发,第二个呢是function那方呢,我们在后面的课程再来讨论这个东西,那么现在呢,先来讨论加发,OK,那么首先第一个。在ES5里边,我们这个万声明变量呢,会有一个变量提升的这么一种现象,什么意思呢?就比如说我们如果说在这个地方实明个,比如说变量AA的值能为一,那这个时候理论来说,我们变量只有在声明了以后才能这个使用,对吧?那么这个ES5的万呢,它不是这样的啊,在声明之前呢,就已经可以使用了,只不过这个时候的使用呢,它这个值你是拿不到这个值的,因为呃,赋值的这个行为啊,这个还没执行对吧,还没执行。
01:08
那么在他编译的阶段,编译的阶段的时候呢,这个声明的A呢,它被初始化了一个值为这个onde defend,对吧?那onde find,所以呢,我们在前面是能够拿到这个onde范的,那这个现象呢,就是我们所说的这一个呃,变量提升,那变量下我们来保存一下,能发现这个地方它输出了一个呃,Find,那这个呢,是我们ES5的万,同时除了这个以外,这个万呢,还有另外一个特点,那就是它所声明的这一个变量。比如说在全局,或者说在最大的这个作用域,Script的这个作用域里面,它所声明的这个变量呢,会被。挂载到我们这个顶层的对象下面,也就是我们所说的window对象的下面去成为window对象的一个。一个属性,那这个时候当我们来打印A的时候,能能拿到一是没问题的,那如果说我来打印window.a的时候,也就是说去访问顶层对象的下面一个叫做A的属性的时候呢,它能够去拿到这个一的值,这是为什么呢?这就是因为这个万声明的全局变量被挂载到了顶层对象的下面,那点在下面,那这样呢,如果说当我们全局这个变量比较多的时候呢,它却通通都会挂载到我们的这个window下面的时候呢,会对我们window对下面的某些属性啊,这些属性呢,可能说会无意之中啊,造成一些污染啊,或者说这个进行一些不是特别好的这个操作啊操作。
02:38
那这种呢,其实都是一些不是特别好的这么一种现象啊,我们需要避免它,那么在ES6里边,呃,声明变量的时候呢,先定义了两个命令,其中一个呢,就是我们所说的这个。那let它的使用呢,跟使用其实是一模一样的,只不过呢,Let声明变量的时候跟va的行为呢不太一样,首先第一个就是我们let所声明的这个变量没有变量提升,也就是说我们必须先声明再使用。如果说。
03:14
啊,如果说如果说我们这个声明之前就能使用这个变量的时候,那么很明显这个变量呢,从逻辑上来讲,这个变量是不存在的,对吧,不存在的,那么不存在呢,肯定是要报错,这样呢才符合逻辑对吧,那么只要,而且这种如果说他报错有什么好处呢?那就是他报错以后能够避免我们一些。呃,完全可以在编写代码过程中就规避掉的问题,对吧,就是这个变量在还没有声明的时候就使用了,那这个时候呢,当我使用的时候呢,他就报错了是吧,他告诉我们说是这个A呢,是一个没有定义的这么一个东西,那没有定义呢,是不能使用的,所以这个时候当我们使用net生命变量的时候,一定要记得第一个就是要声明以后才能使用啊,它没有这个变量提升的这么一种现象,那么同时。
04:05
Let,它声明的这个变量一旦出现声明let出现声明变量的时候,这个变量就会自动的被绑定到了当前的这个作用域。被绑定当前作用,那这个时候我们这个19行生明了一个变量A,那么这个A呢,就被绑定了当前的这个作用欲,那这个时候呢,当你在前面去使用的时候呢,他就能知道,OK,这个A呢,被绑定作用义,但是呢,还没有赋值是吧?没有赋值,所以呢不让用,那不让用的就报错,那么这个行为呢,呃,也叫做一个叫做这个暂时性死区啊,暂时死去,也就是说从A声明或者说某一个变量被let声明之前,到它这个作用域的第一行,那作用于第一行呢,从这个script开始到往后我选中的这一块呢,都属于这个变量A的暂时性死区啊,在这个区域范围内呢,是不能使用这个变量A的啊,这个是。
05:02
Ne的一个特点,哪个特点,还有另外一个特点,就是我们来所说刚才的这个哇,声明的全局变量会挂载到window对象上面去,但是这个时候呢,Let呢,它就很好的规避了这个问题啊,这个问题就不会再出现了,就比如说我们直接打印A的时候呢,能拿到一没问题对吧,因为我们正常的先定义再使用,但这个时候虽然说这个A它同样是个全局变量,但是它没有Y的这个奇怪的特性啊,它不会把这篇论呢挂载到window端下面去,也就说这时候我们再来访问window.a的时候呢,就拿不到这个值啊,拿不到值它是不存在的,那么一个对象下面不存在的。属性,那么它的值呢,是会被初始为on的,所以这时候来保存呢,你会发现拿到的是个on范,而不是我们。所定义的这个一对吧,不是这个一,那这个呢,是let跟万的第二个区别啊,第二区别还有一个区别。
06:05
那么还有一个区别呢,就是什么呢?我们来看一下啊,我们let声明的这个变量呢,诶,我们先来看一下Y吧,诶E5的YA等于一对吧,那下面呢。可能说当我们代码写的不好意思啊,冬天了,这个嗓子有点难受。那么我们这个生命的变量呢,比如说那我们代码写的比较多的时候啊,一直往下翻,往下翻,往下翻的时候呢,我们就。可能说代码多了以后,就不确定这个万声明的某一个变量,比如说A吧。稍等一下。当我们不确定这个A是否被声明的时候,那我们呢,可以再对他进行再次声明。比如,这次声明为一个数组,数组里边有个值为二。
07:05
那么这个时候呢,也是没有问题的,对吧,因为我们变量呢,呃,是可以被重复声明的。上面来打印一下。那么这个时候呢,这个变量A啊,它就。第二次声明把前一次的值给覆盖掉,所以拿到这个数组,那这个呢,你会发现同一个变量被声明了两次,对吧,同一个变量被声明两次,那被声明两次呢,其实像这种呢,也是一种不好的现象啊,那像这种不好的现象呢,在我们使用ES6的声明变量的这个let关键字的时候呢,也会被很好的被规避掉。比如说一样的let a等于B,紧接着再来let a等于随便一个值等于二,那let所生命的变量呢,是不允许被重复声明的,也就是说当你声明过一次以后,接下来你要再来使用这个变量的时候呢,就可以直接用了。你不能再对他进行二次声明。
08:04
那么二次声明呢,是会报错的,所以这个时候呢,他就报错了是吧,告诉你这个A呢,已经被声明过了,不用再声明了,那这个呢,是。另外一个特性,那紧接着。还有一个特性呢,我们就得结合这个作用域来说啊,作用域,那么首先在ES5里边,这个作用域呢,只有一个最大的一个全局的这个作用域,还有就是函数作用语,那在ES6里面呢,这两个作用域依然存在,只不过呢,它又新增了另外一个用语,这个作作用域呢,叫做会计作用语,那会计状语怎么写呢?就是一个大括号包起来的,那这个大括号呢,它不是一个对象,不是一个接省形式的对象,它就是一个状,对吧,我们直接写一对花括号的时候,这个时候呢,它这里边如果说我们使用了let来生,比如说变量B。等于二,那这个时候呢,Let声明的这个变量是有块状用的说法的,那块状语呢,就是说被划括号包裹起来的部分,也就是说现在呢,它是一个独立的状语。那么独立的状语我们。
09:03
先不说这个快状语,我们就来回顾一下ES6的这个状语,那我们所知道的是你在函数某一个函数的这个子状语里面,你是没有办法在它的负作语里面去访问子作用域的变量的,对不对?所以这个时候呢,这个块作用里面的变量呢,这个B呢,只存在于当前这个作语,也就是说我们在这个块作用里面是可以拿到这个变量的,但是当我们在它的负极来拿的时候呢,就不会存在了啊不存在,那不存在我使用B的时候呢,它就报错了啊,B没有定义啊,这个B变量呢,没有定义呢,拿不到,拿不到,那如果说把它移移上去呢,我把它这个放到跨作位里面,那这样呢,理所当然呢,就可以拿到我们的变量B的这个二值,对吧,那这个呢,是let来结合。我们的这个花括号,也就我们所说的这个块作用域啊,它有一个新的特性了,那么要注意的是这个花括号啊,这个块作用域呢,只针对于ES6的这个声明的这个变量的关键字let或者说cost有用,也就是说我在这里面再来使用Y的时候,比如说one c等于三,那这个时候呢,这个三呢,呃,这个C呢,它由于使用的是Y来生明的,那么OKY呢,只有全局作用域和函数作用域,所以它是没有块作用语的,所以这一块状用域对于万声明这个变量是形同虚设,那不存在的,那这个时候我们在外面再来获取的时候,再来访问这个C的时候呢,它是能拿到这个三个值的,能明白吗?那这个呢,是快状语啊,快状语。
10:33
那这个呢,呃,基本就是我们这个ES6啊,Letter声明的跟V声明的一些个这个差距啊,差距它的差异性,那么紧接着我们再来看另外一个,在ES6里面,除了有letter以外,还有另外一个叫做cost。Constant怎么写呢?Con ST constant这个关键字也是用来声明变量的,只不过它声明的变量呢,是叫做常量啊常量,那常量什么意思呢?就是一个,呃,不,不能被改变的一个这么一个变量,那比如说我用cost声明一个常量AA呢,它等于一,OK,那么这个时候,当cost生命的A等于一的时候。
11:17
这个A就不能再被赋值了,它的值一旦被初始化了以后,就不会再改变了,也就是说我后面再来对A,比如说进行二次赋值改变为二的时候,这个时候它就会报错了,他告诉你这个变量是不能够被这个二次赋值的,能明白吗?那这个呢,就是cost所声明的变量啊,是不能被进行二次赋值的,然后。那么其实呃,说到本质上,从本质上来说呢,它这个cost所声明的这个变量呢,并不是说限制的是不能改变它的值啊,它限制的其实是负值的这个行为,而不是说不能改变你的值,那什么意思呢?比如说我们再来紧接着看一个。
12:02
我们现在呢,我们通过cost来声明一个变量,BB呢,我给它一个数组,对吧?来数组的值呢,就叫一二就可以了啊一二就可以了,好,那么紧接着我现在呢,B我把它初始化为一个数组,那这个时候如果说我对B来进行二次负值,负值呢,就是说B后面通过等号来改变它的这个值的时候呢,这是二次负值,那这样是不允许的,那可以可以通过另外一种方式来改变大值,就比如说。首先我们知道就是这个数组呢,它是属于引用型数据,那么引用型数据呢,它这个内存的地址是不会改变的,也就是说当我们不改变你的内存地址的时候,那么这个时候呢,我就不算对它进行赋值了,那这样的时候会被允许的,也就是说我对B,比如说进行一个push的一个操作啊push,那push的时候呢,我push一个三进去来保存,那这个时候呢,我们在下面再来输出一下我们的这个。电缆B来保存,你会发现这个三呢被成功的破水到进去了。
13:05
对吧,那这样我们是不是改变了它初始化这个值,因为你初始化只初始化的一个数组,数组只有两项,一和二,我通过push始操作给你加了一个值为三,我们。是改变这个数组的,但是呢,没有违反这个康的规则对吧?诶没有违反他规则,就是因为这一步是不算一个赋值的这个行为的,为什么呢?因为这个时候我们就没有改变这个B的指向,对吧?你B它指向的内存呢,是这个数组的内存是吧?它代表是一个数组,那现在这个时候B呢,还是这个数组对不对,我只不过把数组进行了一个扩展的操作,对吧?那这个呢,是需要注意的地方啊,觉得那同理呢,还有比如说呃,这个对象啊对象呢,你也可以对它进行这个属性的增加或者说减少,但是呢,你不能通过呃等号来对前面这个变量再来进行重复的声明啊,这个是需要注意的地方。
14:00
然后就是它跟let呃的相同点,就是let有的属性呢,一样是拥有的,就比如说第一个我cost声明的变量呢,一样的必须要先声明再使用,不能在声明之前使用,比如说我声明之前我仅仅是来输出一下。这个值变量B一样会报错,告诉你没有定义,那它跟Y是一样的是吧,那这个是第一点,那第二点同样的,它声明的这个变量一样的,不会挂载到window端上面去,跟let一样的,第三个结合这个画括号的时候,也就我们所说的这个快作语的时候呢,诶它这个B呢,比如说我把它写到这个快状语里面去。我们在下面重新再来写一个。来看声明,一个变量AA呢等于一,那这个A呢,它依然是属于这个作用域的,你在负极是访问不到的,那我们呢,只能在这个快作域里面去访问到这个变量A,对吧。
15:01
等会啊。是吧,诶这个地方没问题吧,诶它这里边是属于一个快中域,我们只能在这里边来对它进行一个访问。注,是这个来保证,哎,一就说错了对吧,它一样用有快赠语,还有一点,那就是constant生命的变量也不允许被重复声明啊,不许被重复声,但是要注意的一点啊,就是这个重复声明呢,并不是说使用同一个关键字来声明同一个变量才属于重复声明,就比如说YA等于一啊,再来let a等于二,那这样是属于重复声明的,没错,但是如果说把这个letter换为cost一样的,我们依然是对同一个变量进行了二次声明,那这个呢,也是不被允许的。能明白吗?这样依然会报错。而且就算我把这个cost换为了一个万。他会不会报错呢?来报存依然会报错是吧,只要你这个变量有被let或者说cost来声明过了以后,就不允许再被任何的方式进行声明了,包括万万放到前面去也是一样的,对吧?那这个呢,就是我们E6的这个声明变量的这个letter以及cost的这个特性,那这个大家需要注意一下好吧,那我们这个视频呢,就到这里,谢谢大家。
我来说两句