var变量的优缺点
var变量在我们学习JavaScript时,是最常用的变量,但是在我们做大型项目的时候,会发现有很多不可避免的问题,所以在这里我简单说一下关于var变量声明时存在的几个问题:
1、允许重复变量的声明,导致数据被覆盖
通俗的讲,就是在编译,我们运用var生成一个变量,正常情况下,这个变量是不会再被生成的,但是var还可以允许生成并且不会报错,而且里面的数据是会覆盖前面的数据,这个问题是很头疼的,比如你写了1000行代码,但是最后运行的数据出错了,你就要检查代码,你会很难发现问题在哪里。下面我们举一个例子:
var a = 1 ;
function print() {
console.log(a);
}
//假如有1000行代码
var a =2;
print();
2、变量提升
首先解释一下什么是变量提升,在这里你要明白什么是全局变量和局部变量,你了解之后就很简单了,在这里就是局部变量提升到全局变量,举一个例子就明白了:
if(Math.random() < 0.5 ){
var a = "123";
console.log(a);//①
}else{
console.log(a);
}
console.log(a);//②
//在这里我们随机生成一个数,如果这个数小于0.5,那么我们就声明变量a,并且赋值为123,如果随机数大于0.5,则输出a;
//变量提升:我们在if语句中生成的变量a,但是他会从if语句中提升到全局变量中,我们理解的是他只能在if语句中使用,但是②中也会输出123,就是因为他跑到了全局变量中
(1)变量提升会造成该以数据的访问,说白了就是你不知在哪里就会冒出个数据,而且这个数据只在局部变量中。
(2)闭包问题
3、局部变量挂载到全局对象,造成全局对象的污染
var abc = '2';
console.log(window.abc);
//正常情况下,全局变量是没有abc这个变量的,但是结果会输出2,这就是因为局部变量挂载到全局对象,造成了全局的污染
对于这个问题,我们如果生成全局中有的变量,就会覆盖全局变量中的问题,会导致很多奇奇怪怪的问题。
怎么解决以上问题
很简单,我们只需要把var换成let来生成就可以了
1、let不允许当前作用域下重复声明(不同作用域下可以重复声明),比如
let a = 2 ;
let a = 3;
//会报错,并且报错第二句话,检查到当前作用域(全局作用域)已声明了变量a
2、不会污染全局变量,就是不会变量提升
let a = 123;
console.log(window.a);
//会输出undefined,
但是实际上,在底层实现的时候let也会有变量提升,只不过是提升后放入了“暂时性死区”,在这里面我们无法访问,但是报错会报“ Cannot access ‘a’ before initialization”。当代码运行到该变量声明语句时,会将其从“暂时性死区”移除。
注意:在循环中,用let声明的循环变量,会特殊处理,每次进入循环体,都会开启一个新的作用域 ,并将其循环变量绑定到该作用域(每次循环使用 一个新的作用域) ,循环过程中可以使用,循环过后会销毁。
当然在这里const也可以,const是用来声明常量的,从const和let完全相同,但是用const时,必须在声明时赋值并且不可以重复赋值,一般用于设定固定数值。