var,let,const的区别
var:没有块的概念,可以跨块访问, 不能跨函数访问。
let:能在块作用域里访问,不能跨块访问,也不能跨函数访问
const:用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,其基本数据类型是不可以修改的,对于(其他复杂数据类型)引用数据类型某些是可以更改的,比如说对象的属性,数组索引对应的值一类的,因为修改引用类型的值并没有更改其地址值,const所定义的变量实际是所定义变量的地址值不可以更改。
为什么会进行变量提升呢?
JS在拿到一个变量或者一个函数的时候,会有两步操作,即解析和执行。
在解析阶段,JS会检查语法,并对函数进行预编译。解析的时候会先创建一个全局执行上下文环境,先把代码中即将执行的变量、函数声明都拿出来,变量先赋值为undefined,函数先声明好可使用。在一个函数执行之前,也会创建一个函数执行上下文环境,跟全局执行上下文类似,不过函数执行上下文会多出this、arguments和函数的参数。
全局上下文:变量定义,函数声明
函数上下文:变量定义,函数声明,this,arguments
在执行阶段,就是按照代码的顺序依次执行。
主要有以下两个原因:
提高性能
容错性更好