1、var:顶层对象的属性和全局变量是等价的,用var声明的变量既是全局变量,也是顶层变量
var a = 10
console.log(a) // 10
(1) 使用var声明的变量存在变量提升的情况
console.log(b)
var b = 20
// 会变成以下代码执行
var b
console.log(b)
b = 20
(2)使用var,我们能够对一个变量进行多次声明,
后面声明的变量会覆盖前面的变量声明
var c = 20
var c = 30
console.log(c) // 30
(3)在函数中使用使用var声明变量时候,该变量是局部的
var d = 20
function change() {
var d = 30
}
change()
console.log(d) // 20
// 如果在函数内不使用var,该变量是全局的
var e = 20
function change() {
e = 30
}
change()
console.log(e) // 30
2、let:let是ES6新增的命令,用来声明变量
(1)用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效
{
let f = 20
console.log(f) // 20
}
console.log(f) // ReferenceError: f is not defined.
(2)不存在变量提升
console.log(g) // ReferenceError
let g = 2
(3) let声明的变量被所属于的代码块限制作用范围
if (true) {
let num = 100
console.log(num) // 在代码块内可以使用
}
console.log(num) // 代码块外不行
3、const
(1)const声明一个只读的常量,一旦声明,常量的值就不能改变
const一旦声明变量,就必须立即初始化,不能留到以后赋值
const h
console.log(h)
// TypeError: Assignment to constant variable.
(2)如果之前用var或let声明过变量,再用const声明同样会报错
var num3 = 20
let num4 = 20
const num3 = 30
const num4 = 30
// 都会报错
小结:
+ let和const不存在变量提升,即它们所声明的变量一定要在声明后使用,否则报错
+ var不存在暂时性死区,let和const存在暂时性死区,只有等到声明变量的那一行代码出现,才可以获取和使用该变量
+ var不存在块级作用域,let和const存在块级作用域
+ var允许重复声明变量,let和const在同一作用域不允许重复声明变量
+ var和let可以修改声明的变量,const声明一个只读的常量。一旦声明,常量的值就不能改变