ES6之前的JavaScript变量由var声明,而var声明的变量是始终保存在内存中的,为了实现块级作用域,我们会使用闭包模拟,但实际上非常的不方便。ES6添加了let和const标识符,弥补了这些不足。
var和闭包
我们先来了解一下var和闭包,下面用花括号生成一个块级作用域,在其内创建变量count:
{
var count = 5;
}
console.log(count);//5
我们可以看到在块级作用域外部仍然可以访问count变量。实际上这段代码等效为:
var count;
{
count = 5;
}
console.log(count);//5
这就是说,变量count的声明被提升至函数顶部,而初始化操作仍旧留在原初执行。
如果想要模拟块级作用域,实际上我们要做的是在使用变量的时候为其赋值块级作用域的值。利用函数的特性(可以参考这里理解),再来看一下闭包:
(function(){
var count = 5;
console.log(count);//5
})