随着ES6的到来,var已经不再是单一的定义变量的方法。
一、首先用var定义变量有这样的bug:
1.js没有块级作用域,在js函数中用var定义变量,其作用域是整个函数体的全部。
for (var i = 0; i < 10; i++) { var a = 1;}console.log(a)
我们在for循环的外面可以拿到for循环里面定义的变量。
2.循环内变量过度共享
for (var i = 0; i < 3; i++) { setTimeout(function () { console.log(i) }, 1000)}
上面的for循环,你觉得会输出什么呢,输出结果是三个3,循环本身和三次 timeout 的回调均共享唯一的变量 i,当循环结束执行的时候,i的值为3。所以当第一个timeout执行时,调用的i值为3,所以输出了三个3。
二、let,超级好用的!
1.**使用let声明的变量拥有块级作用域。**使用let声明的变量的作用域只是外层块,并不是整个外层函数。let声明仍保留了提升特性,但不会盲目提升,在用var定义变量的例子一中,我们采用let替代var来定义变量,这样我们在for循环外面就拿不到let定义的变量。
2.**使用let声明的全局变量不是全局对象的属性。**我们用let定义的变量是不能通过window.变量名的方式来访问这些变量,它们存在于一个不可见的块级作用域中。
3.**形如for(let i...)的循环在每次迭代的时候都会为i创建新的绑定。**就像var中的第二个例子,如果一个循环执行多次,并且循环都保持了一个闭包,那么每个闭包将会拿到循环变量的不同值,而不是像var定义的变量那样,所有闭包都拿到循环变量的同一个值。
三、cosnt,声明常量!
const是用来声明定义常量的,在ES6中,const 声明的常量类似于指针,它指向某个引用,也就是说这个常量并非一成不变的,比如:
{ const ARR = [5, 6]; //var ARR = [5,6] ARR.push(7); console.log(ARR); // [5,6,7] ARR = 10; // TypeError 若用var定义变量,则ARR可以赋值 console.log(ARR)}
我们用const定义的数组,是可以操作数组在数组里面添加数据的,但是我们不能给这个变量重新赋值,const不能只声明不赋值,const在使用时,请使用大写变量!