一、课程名称:前端工程师2022版
二、课程章节:ES6基础入门-初识ES6(3-5 let、const 与 var 的区别-1-慕课网体系课 (imooc.com))
三、课程讲师:Alex
四、课程内容:
let、const与var区别:
(1)重复声明
1)概念:已经存在的变量或常量,又声明了一遍
2)区别:var允许重复声明,而let、const不允许
①原先使用var定义声明的变量,再后续重新进行声明,是可以声明成功的,控制台不会报错,而原先使用let或const声明的变量,后面再声明一遍,控制台是会报错的
②概念中已经存在的变量或常量,包括了var、let、const声明的变量,同时也包括了传入的参数,只要已经存在了,再使用let或const进行声明,控制台也是会报错的
(2)变量提升
1)var会提升变量的声明到当前作用域的顶部
2)let和const不存在变量提升,这有助于养成良好的编程习惯,对于所有变量或常量,做到先声明,后使用
(3)暂时性死区
1)概念:ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量或常量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量或常量,就会报错。总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”。
简而言之,只要作用域内存在let、const,它们所声明的变量或常量就会自动“绑定”这个作用域,不再受到外部作用域的影响,这一点只有let和const有,var没有
2)ES6规定暂时性死区和let、const语句不出现变量提升的目的:主要是为了规范代码书写,减少运行时的错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。
3)暂时性死区的本质:只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码执行过后,才可以获取和使用该变量,也就是先声明,再使用。
4)具体举例说明:如果在函数的外部和内部都使用let声明了a,此时如果调用了函数,函数产生作用域,该作用域就会与函数内的a产生绑定关系,此时函数体内执行与a有关的语句,结果将取决于函数内部的a,而如果并没有在函数内部使用let或const声明变量,那么函数就会向外寻找全局作用域中的a,再进行计算
(4)window对象的属性和方法(全局作用域中)
全局作用域中,var 声明的变量、通过function声明的函数,会自动变成window对象的属性或方法,而let、const不会
(5)块级作用域
1)什么是块级作用域:块级作用域就是作用域的一种(全局、函数、块级)
①var没有块级作用域,例如for循环语句中,使用var定义一个i,i既可以在for循环语句中被打印出来,也可以在for循环语句外被打印出来,这是因为var定义的是全局变量,自然是可以在全局作用域中打印出来
②let&const有块级作用域,例如for循环语句中,使用let定义一个i,i可以在for循环语句中被打印出来,但不可以在for循环语句外被打印出来,这是因为let有块级作用域,for循环一旦结束,定义的i就自然销毁,此时在外面执行打印会报错,并表示没有定义i
2)作用域链
①在语句的最外层,会有一个全局作用域
②当函数被调用时,会产生函数作用域
③函数体内for循环语句执行时,由于使用let定义i,会产生块级作用域
④如果要在函数体for循环中打印j,那么就会从最内层的块级作用域出发,先在块级作用域中寻找,如果没有找到,就在函数作用域中寻找,如果还是没有找到,就继续往外层的全局作用域寻找,如果仍然不存在,就会报错,所以顺序是内层作用域->外层作用域->……->全局作用域
3)有哪些块级作用域:只有和let、const合作才会有
①{}花括号内可以形成一个块级作用域
②for循环内可以形成一个块级作用域:for(){}
③while循环内可以形成一个块级作用域:while(){}
④do while循环内可以形成一个块级作用域:do()while{}
⑤if条件判断语句中可以形成一个块级作用域:if(){}
⑥switch语句中可以形成一个块级作用域:switch(){}
4)注意花括号也不一定都是块级作用域
①function(){}表示函数作用域
②对象的花括号不构成任何作用域:const person = {},但是如果对象中写了方法,那么那个方法是可以构成函数作用域的
五、课程收获:
今天学习了let、const与var区别,其中几个概念是新接触的,刚开始学习还有点懵,但是在继续课程的学习和查资料后,慢慢吸收了一些知识点,继续加油!