继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【金秋打卡】第3天let、const与var 的区别

宣7595077
关注TA
已关注
手记 47
粉丝 2
获赞 1

一、课程名称:前端工程师2022版

二、课程章节:ES6基础入门-初识ES6(3-5 let、const 与 var 的区别-1-慕课网体系课 (imooc.com))

三、课程讲师:Alex

四、课程内容:

let、const与var区别:

(1)重复声明

1)概念:已经存在的变量或常量,又声明了一遍

2)区别:var允许重复声明,而let、const不允许

①原先使用var定义声明的变量,再后续重新进行声明,是可以声明成功的,控制台不会报错,而原先使用let或const声明的变量,后面再声明一遍,控制台是会报错的

 http://img3.sycdn.imooc.com/63580e0f0001925503020098.jpg

②概念中已经存在的变量或常量,包括了var、let、const声明的变量,同时也包括了传入的参数,只要已经存在了,再使用let或const进行声明,控制台也是会报错的

(2)变量提升

1)var会提升变量的声明到当前作用域的顶部

 http://img1.sycdn.imooc.com/63580e240001689104200237.jpg

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,再进行计算

 http://img4.sycdn.imooc.com/63580e470001c38d03810267.jpg

(4)window对象的属性和方法(全局作用域中)

全局作用域中,var 声明的变量、通过function声明的函数,会自动变成window对象的属性或方法,而let、const不会

 http://img1.sycdn.imooc.com/63580e5000017d6204550189.jpg

(5)块级作用域

1)什么是块级作用域:块级作用域就是作用域的一种(全局、函数、块级)

①var没有块级作用域,例如for循环语句中,使用var定义一个i,i既可以在for循环语句中被打印出来,也可以在for循环语句外被打印出来,这是因为var定义的是全局变量,自然是可以在全局作用域中打印出来

 http://img1.sycdn.imooc.com/63580e5d0001d6a705770122.jpg

②let&const有块级作用域,例如for循环语句中,使用let定义一个i,i可以在for循环语句中被打印出来,但不可以在for循环语句外被打印出来,这是因为let有块级作用域,for循环一旦结束,定义的i就自然销毁,此时在外面执行打印会报错,并表示没有定义i

 http://img1.sycdn.imooc.com/63580e6800017df004210097.jpg

2)作用域链

①在语句的最外层,会有一个全局作用域

②当函数被调用时,会产生函数作用域

③函数体内for循环语句执行时,由于使用let定义i,会产生块级作用域

④如果要在函数体for循环中打印j,那么就会从最内层的块级作用域出发,先在块级作用域中寻找,如果没有找到,就在函数作用域中寻找,如果还是没有找到,就继续往外层的全局作用域寻找,如果仍然不存在,就会报错,所以顺序是内层作用域->外层作用域->……->全局作用域

 http://img1.sycdn.imooc.com/63580e700001525404200237.jpg

3)有哪些块级作用域:只有和let、const合作才会有

①{}花括号内可以形成一个块级作用域

 http://img1.sycdn.imooc.com/63580e7b00011e5404670116.jpg

②for循环内可以形成一个块级作用域:for(){}

③while循环内可以形成一个块级作用域:while(){}

④do while循环内可以形成一个块级作用域:do()while{}

⑤if条件判断语句中可以形成一个块级作用域:if(){}

⑥switch语句中可以形成一个块级作用域:switch(){}

4)注意花括号也不一定都是块级作用域

①function(){}表示函数作用域

②对象的花括号不构成任何作用域:const person = {},但是如果对象中写了方法,那么那个方法是可以构成函数作用域的

五、课程收获:

今天学习了let、const与var区别,其中几个概念是新接触的,刚开始学习还有点懵,但是在继续课程的学习和查资料后,慢慢吸收了一些知识点,继续加油!


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP