var
声明的变量:没有块级作用域,而且存在变量提升的情况
变量提升
- 所有的声明都会被提升到作用域的最上面
- 同一个变量只会声明一次,其他的会被忽略掉或者覆盖掉
例一:
console.log(a);
var a = 123;
打印的结果:
undefined
解析:上面代码经过预编译后应该是下面这样的
var a;
console.log(a);
a = 123;
例二:
console.log(v1);
var v1 = 100;
function foo() {
console.log(v1);
var v1 = 200;
console.log(v1);
}
foo();
console.log(v1);
打印结果:
undefined
undefined
200
100
解析:经过预编译的代码,注意:var
声明的变量是有函数作用域的
var v1;
console.log(v1); //undefined
v1 = 100;
function foo(){
var v1;
console.log(v1); //undefined
v1 = 200;
console.log(v1); //200
}
foo();
console.log(v1); //100
var
声明的变量不存在块级作用域(ES6中新增块级作用域)
常见的块级作用域有if
语句,for
循环等等。
例一:
var num = 123;
if(true){
console.log(num) // 123
var num = 456;
console.log(num) // 456
}
console.log(num) // 456
打印结果:
123
456
456
预编译后的代码:
var num;
num = 123;
if(true){
console.log(num);
num = 456;
console.log(num);
}
console.log(num);
可以看到在块作用域if
语句中,并不存在var
声明的变量num
的变量提升。
const
常用来声明常量,且常量不可修改,必须初始化,存在着块级作用域
不存在变量提升
console.log(a);
const a = 123;
运行结果
Uncaught ReferenceError: Cannot access 'a' before initialization
存在块级作用域
const num = 456
if(true){
const num = 789;
console.log(num); // 789
}
console.log(num) // 456
打印结果:
789
456
“常量不可修改”指的是对应的内存地址不可更改,而不是对应的值不能更改
const a = {};
a.b = 13;
上述代码不会报错
let
存在块级作用域,没有变量提升
let num = 456
if(true){
let num = 789;
console.log(num); // 789
}
console.log(num) // 456
打印结果:
789
456