ES6新增加了两个重要的 JavaScript 关键字: let 和 const。
-
let 声明的变量只在 let 命令所在的代码块内有效(块级作用域、局部作用)
-
const 声明一个不可修改的常量,一旦声明,常量的值就不能改变。
1.let
1)let声明的变量不存在提升,不能在let代码运行先,调用变量
console.log(a)
let a="报错"
正确的顺序应该是:
let a="正常运行"
console.log(a)
2)let声明的变量只在所在代码块内生效
{
let a="只在代码块内生效"
console.log(a)//正常运行
}
console.log(a)//报错,a未定义
let在全局中声明的变量,局部作用域,块级作用域中也可以使用,但你却不能使用window.a访问这个变量
let a=12
!function(){
console.log(a)
}()
//打印12
{
console.log(a)
}
//打印12
console.log(window.a)
//undefined
3)不能重复声明let声明的变量,但可以改变变量的值
let a=12
let a=12
//报错
----------------------------------
let a=12
{let a=12}
//不报错
----------------------------------
{
let a=12
let a=12
}
//报错
----------------------------------
let a=12
a=13
//不报错
----------------------------------
{
let a=12
a=13
}
//不报错
4)重新定义变量问题,let在不同作用域中声明同名变量不会改变其他作用域中该变量的值
let a=12
console.log(a)//12
{
let a=30
console.log(a)//30
}
console.log(a)//12
2.const
1)一旦声明,必须初始化,否则报错
const a
a=12
//报错
2)当你试图改变变量的值,报错
const a=12
a=30
//报错
3)和let一样不存在提升,不能在声明前使用该变量
console.log(a)
const a=12
//报错
4)和let一样,在全局声明,你可以在块级,局部作用域调用它,但仍然不能使用window.a调用
const a=12
{
console.log(a)//12
}
console.log(a)//12
!function(){
console.log(a)//12
}()
const a=12
console.log(window.a)
//undefined
5)在不同作用域可以声明相同变量,同作用域就不行,同let
const a=12
{
const a=30
}
//不报错
const a=12
const a=30
//报错
3.总结
共同点:1.同作用域不能重复声明相同变量,不同作用域可以声明同名变量
2.在全局作用域声明的变量都不能使用window.变量名调用,原因:其实这里let const声明的变量属于顶层作用域
3.都不存在提升,不能在声明前使用
4.暂时性死区:ES6 明确规定,代码块内如果存在 let 或者 const,代码块会对这些命令声明的变量从块的开始就形成一个封闭作用域。代码块内,在声明变量 a之前使用它会报错。
const a=12
{
console.log(a)//报错
const a=30
}
5.……
不同点:1.const必须初始化(第一次赋值),let不用
2.const的值不可修改,let可以再修改变量的值