浅谈let、const和var的区别以及作用域提升

54 阅读2分钟

ES5中声明变量都是用var关键字,从ES6开始新增了两个关键字可以声明变量:let、const

let:

  • 从直观的角度来说,let和var没有太大区别,都是用于声明一个变量

const:

  • const是constant的单词缩写,表示常量的意思。
  • 它表示保存的数据一旦被赋值,就不能被修改。
  • 但是如果赋值的是引用类型,那么可以通过引用找到对应的对象,修改对象的内容。

注意:let、const不允许重复声明变量

let/const作用域提升

let、const和var的另外一个重要区别是作用域提升:

我们知道var声明的变量是会进行作用域提升的;

但是我们如果使用let声明的变量,在声明前访问会报错;

console.log(foo) //报错

let foo = 'foo'

那么是不是意味着foo变量只有在代码执行阶段才会创建呢?

事实上并不是这样,我们可以看一下ECMA262对let和const的描述:

这些变量会被创建在包含他们的词法环境被实例化时,但是是不可以访问它们的,直到词法绑定被求值。

image.png

let、const有没有作用域提升呢?

从上面我们可以看出,在执行上下文的词法环境创建出来的时候,变量实际上已经被创建了,只是这个变量是不能被访问的。

那么变量已经有了,但是不能被访问,是不是一种作用域的提升呢?

事实上维基百科并没有对作用域提升有严格的概念解释,那么我们从字面量上理解;

作用域提升:在变量声明的作用域中,如果这个变量可以在声明前被访问,那么我们可以称之为作用域提升;

在这里,它虽然被创建出来了,但是不能被访问,我认为不能称之为作用域提升;

所以我的观点是let、const没有进行作用域提升,但是会在解析阶段被创建出来。