var let const声明变量
var
变量foo用var声明,会发生变量提升,即脚本开始运行时,变量foo已经存在了,但是没有值,所以会输出undefined
// var 的情况
console.log(foo); // 输出undefined
var foo = 2;
变量提升:当栈内存(作用域)形成,js代码自上而下执行之前,浏览器首先会把所有带有“var”和“function”关键词的进行提前声明或者定义,这种处理机制叫做变量声明
//声明(declare):
var a;(默认值undefined)
//定义(defined):
a=12;(定义其实就是赋值操作)
变量提升阶段
- 带“var”的只声明未定义
- 带“function”的声明和定义(赋值)都完成了
let
变量bar用let命令声明,不会发生变量提升,这表示在声明它之前,变量bar是不存在的,这时如果用到它就会抛出一个错误
// let 的情况
console.log(bar); // 报错ReferenceError
let bar = 2;
ES6在附录B里规定,浏览器有自己的行为方式
- 允许在块级作用域内声明函数
- 函数声明类似于var,即会提升到全局作用域或函数作用域的头部
- 同时,函数声明还会提升到所在的块级作用域的函数声明当中
注意:上面的三条规则只对ES6的浏览器的实现有效,其他环境的实现不用遵守,还是将块级作用域的函数声明当作let来处理
const
const 实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。
- 对于简单类型的数据(number、boolean、string等),值就保存在变量指向的那个内存地址,因此等同于常量
- 对于复合类型的数据,变量指向的内存地址,保存的只是一个指针,const只能保证这个指针是固定的