1.var不具有块级作用域 let const 具有块级作用域
{
var a=1
console.log(a) //1
}
console.log(a) //1
{
let b=1
console.log(b) //1
}
console.log(b) //报错 a is not defined
2.var声明的变量存在变量提升(预解释,预解析),let和const声明的变量不存在变量提升
//1
console.log(a); //undefined
var a = 10;
// // 如果一个变量声明以后,会把变量的声明提升到整个作用域的最前面,但是**赋值还是原来的位置**
//等价于 var a;console.log(a); a=10;
//2
console.log(a) //a 没定义
a = 10
// 如果一个变量没有声明直接赋值,作用域就是**赋值以后的区域可以使用**
//3
add()
function add() {
console.log(111) //111
}
// 通过function 函数名(){}定义的函数,会把整个函数提升到作用域的最前面
//等价于 function add(){...} add();
//4
add() //报错 add不是一个函数
var add = function() {
console.log(111)
}
//通过var声明 只会把变量提升到前面 赋值还是原来的位置
// 等价于 var add; add(); add=function(){...}
//5
var a = 10;
function add() {
console.log(a); //undefined
var a = 100;
}
add()
// 全局变量和局部变量同时生效,优先局部变量
//6
function add() {
var a = 100;
}
console.log(a) // a没定义
// 在函数定义中var的变量 仅在调用时,动态创建 调用后,会随着局部作用域一同销毁!
//7
function add() {
a = 100;
}
add()
console.log(a) //100
// 如果一个变量没有声明直接赋值, 作用域就是赋值以后的区域可以使用
//8
function add() {
var a = 100;
}
add();
console.log(a); //a 没定义
//函数内部声明的变量 只能在函数内部使用
3.var可以重复命名以声明的变量,const和let不能
// var a = 0
// var a = 1
// console.log(a); //1
// let a = 0
// let a = 1
// console.log(a); //报错 不可重复命名
const a = 0
const a = 1
console.log(a); //报错
4.let和const声明的变量具有暂时性死区,var则没有
var a = 100
if (true) {
a = "aaa"
let a
}
在if的大括号“{}”内的块级作用域中出现了let定义了a变量,在该作用域内let定义a之前该变量都是不可用的。 这种现象被称为暂时性死区,简称(TDZ)。
5.const声明的变量不可以修改,let和const声明的变量可以修改