ES6中let、const的使用以及和var的区别以及注意点

121 阅读2分钟

一:let 1.代码块内有效 2.不能重复声明 3.不存在变量提升 用法:

let a = xxx;
console.log(a);//xxx

变量提升:

//输出10个10;
for (var i = 0; i < 10; i++) { setTimeout(function(){ console.log(i); }) }
//输出0到9
for (let j = 0; j < 10; j++) { setTimeout(function(){ console.log(j); }) }

原因: var声明是全局有效,全局中只有一个变量i, 每次循环时,setTimeout定时器里面的i指的是全局变量i,而循环里的十个setTimeout是在循环结束后才执行,所以此时的i都是 10。 let是块作用域,当前的只在当前有效,每次循环的j都是一个新的变量,所以setTimeout定时器里面的j其实是不同的变量。

console.log(a);//underfind
var a = xxx;

console.log(b);报错
let b = xxx;

二:const 声明一个只读变量,声明之后不允许改变。和let一样,必须先声明,再使用。然后es6文档上有个注意点是const和let都是封闭作用域。

ps:const 如何做到变量在声明初始化之后不允许改变的?其实 const 其实保证的不是变量的值不变,而是保证变量指向的内存地址所保存的数据不允许改动。此时,你可能已经想到,简单类型和复合类型保存值的方式是不同的。是的,对于简单类型(数值 number、字符串 string 、布尔值 boolean),值就保存在变量指向的那个内存地址,因此 const 声明的简单类型变量等同于常量。而复杂类型(对象 object,数组 array,函数 function),变量指向的内存地址其实是保存了一个指向实际数据的指针,所以 const 只能保证指针是固定的,至于指针指向的数据结构变不变就无法控制了,所以使用 const 声明复杂类型对象时要慎重。

人话:用我认识一大佬说的话就是对于复杂类型,我(const)只是保证门牌号(指针)是对的,房子里面的东西(数据结构)我不保证。简单类型直接 === 常量。 但我对外就说我声明的是只读常量,谁赞成?谁反对?

封闭作用域: 江湖人称小闭包,如果一个对象不再被引用,那么这个对象会被GC回收,否则这对象一直保存在内存中。具体自行百度吧,闭包说实话我理解也不是很透彻,感觉很玄乎。