var、let、const的区别

131 阅读2分钟

随着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在使用时,请使用大写变量!