const、let是ES6的新特性,可以声明块级作用域
- 到底会不会声明被提升,现在说法不一
- 个人认为也不会被提升,但是和var一样不能先使用再声明
- var 声明的变量会被提升到顶部,再赋值
console.log(a) var a = 1 // undefined
- const、let会在声明地方到块级顶部形成临时性死区,在这区间使用该变量都会被报错
ES6规定如果块内存在let命令,那么这个块就会成为一个封闭的作用域,并要求const、let变量先声明才能使用,如果在声明之前就开始使用,它并不会引用外部的变量。console.log(a) let a = 1 // VM92:1 Uncaught SyntaxError: Identifier 'a' has already been declared
- 用法总结
const一般用来声明常量,且声明的常量是不允许改变的,只读属性,因此就要在声明的同时赋值。const与let一样,都是块级作用域,存在暂时性死区,不存在变量声明提前,不允许重复定义,不会成为全局对象的一个属性。
更新
const、let会不会被提升,我犹豫了
提升 — 关键是怎么定义提升的
要理解提升的定义,还需要搞懂js变量的执行过程
js变量的执行过程包括
创建 =》初始化 =》 赋值
var 声明的变量执行过程
找到当前作用域中所有var声明的变量,创建变量 =》初始化为 undefined =》**执行代码** =》 赋值
function 声明的变量执行过程
找到当前作用域中所有function声明的变量,创建变量 =》初始化 =》赋值 =》**执行代码**
let 声明的变量执行过程
找到当前作用域中所有let声明的变量,创建变量 =》**执行代码** =》初始化为let声明的值,没有就为undefined =》 赋值(修改值)
const 声明的变量执行过程
找到当前作用域中所有let声明的变量,创建变量 =》**执行代码** =》初始化为let声明的值,没有就为undefined
const 没有赋值过程
有没有被提升,主要看代码执行的时机
- let 的「创建」过程被提升了,但是初始化没有提升。
- var 的「创建」和「初始化」都被提升了。
- function 的「创建」「初始化」和「赋值」都被提升了。
深入了解,请参考https://zhuanlan.zhihu.com/p/28140450