一、var与let声明变量的区别
1、使用let声明变量
(1)在ES5中使用var声明变量
注意:上面第三张图中的V1用var重新声明变量是重新为变量分配所占区域,而不是覆盖,这也使得用var声明变量容易使变量被污染。
使用var声明变量只支持全局作用域和局部作用域,而放在函数中的变量就是局部变量(局部作用域或函数作用域),此外就是全局变量(全局作用域)。上述的if判断语句中的v1、v2不是在函数中声明的,不满足局部作用域的条件,所以v2、v3都是全局变量,故可以直接输出相应的值。
上述代码在for循环的条件下不能解决fs[x]=x的问题,原因在于var声明的变量只会在全局作用域或局部作用域中,而在局部作用域fs()中,找不到局部变量i的声明,就只能到全局作用域中找是否存在变量i的声明。此处找到的for循环中使用var声明的全局变量i经过执行后已增加为5,所以无论调用fs[x]();中的x为多少,输出的值都会是5。
(2)在ES6中使用let声明变量
上面的第四张图中的不存在第三张图中的重复声明的情况,因为使用let声明变量支持块级作用域(也称为代码块作用域),通常情况下,只要存在花括号{}就是一个块级作用域。此处的if判断语句的{}属于块级作用域,在{}里面声明的v6就只能被{}中的语句使用,故输出444,对{}外的v6无影响。而处于{}外的v6应该在全局作用域中找v6的声明,故{}外的v6等于222。
上面代码for循环能解决fs[x]=x的问题,其中的for循环使用let声明变量i,支持块级作用域。在函数作用域fn()中找不到变量i的声明,此时就会到上一级的作用域中继续找变量i的声明,就会找到for循环中的变量i,因为支持块级作用域,故有以下分析过程:
二、const声明常量
1、const声明变量的用法
使用const来声明常量(常量也就是指不能被修改的量),其声明格式与let、var一样。
2、const声明常量的特性
(1)使用const声明常量时一定要赋初始值,就是在声明常量的同时赋予它一个值。
(2)一般定义常量使用大写字母,这是潜规则,并不是语法的要求。
(3)const声明常量时一旦赋初始值后,其值就不能再修改。
(4)const声明常量也支持块级作用域。
(5)特别地,使用const声明常量,对于数组和对象元素的修改,不算做对常量的修改,不会报错。虽然数组或对象的元素发生了变化,但常量数组或对象所指向的地址并没有发生变化。
控制台输出如下: