var、let、const的区别
一.var
1.var属于ES5规范
2.预解析
var有预解析阶段,会被js解析器扫描,然后放进仓库,等待逐行代码的执行,此时var声明的变量初始值是undefined
3.声明提升
var会存在声明提升,当js解析器扫描到var关键字后,会将var声明的变量放进当前作用域的顶部
4 作用域
全局作用域或者函数作用域.
5.挂载对象
var 声明的全局变量会挂载到window对象上
二.let
1.let属于ES6规范
2.let只在块级作用域有效
一般一个大括号就是一个块
for (var i = 0; i < 10; i++) {
console.log(i);
};
alert(i);
for (let v = 0; v < 10; v++) {
console.log(v);
}
alert(v);
if(true) let a = 20; //会报错
if(true)
{
let a = 20; //不会报错
}
3.let声明变量不会提升
let声明的变量一定要在声明之后使用,否则报错。
alert(a);
var a = 2;
alert(b);
let b = 2;
//注意:let声明的变量一定要在声明之后使用,否则报错。
4.不能通过let声明和形参相同的变量
function test(a) {
let a = 123;
console.log(a);
}
test(456);
5.暂时性死区
ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。
在暂时性死区中使用let或const声明的变量,会报错
6.let声明全局变量
let声明的全局变量,不会成为window的属性,并没有挂载到window对象上
三.const
1.属于ES6规范
const声明的变量一定要在声明之后使用,否则报错。
2.声明只读常量
const常量一旦声明,常量将不能重新赋值!
3.必须初始化
const一旦声明,就必须立即初始化,不能留到以后赋值!
4.const本质
const实际上保证的,并不是值不能改变,而是指向的那个内存地址不能改变
四:总结:
1.var是es5,有预解析阶段,存在变量提升,有全局作用域和函数作用域,声明的全局变量会挂载到window对象上
2.let是es6,有块级作用域,没有变量提升,声明的变量一定要在声明之后使用,声明的全局变量不会挂载到window对象上
3.const是es6,声明的变量一定要在声明之后使用,声明的变量不能重新赋值,一旦声明就要立刻初始化