let 声明变量
特性:
1.不能先访问再声明 会报错 不会像var为undefined(不存在变量提升)
console.log(n) //报错 不可提前声明 没有隐式提升
let n = 20
console.log(n) //20
// var
console.log(n) //undefined
var n = 20
2.let所在的代码块会有隐式作用域
{
var a = 20
var b = 30
let c = 40
console.log(a, b, c) //20 30 40
}
console.log(a) //20
console.log(c) //报错
3.同一个作用域出现同名变量名会报错(不能重复声明)
let a = 10
let a = 20
console.log(a)
const 声明常量
特性:
1.声明时必须初始化且只能初始化一次
//正确写法
const a=90
//错误写法
const a
a=90
2.不能重新赋值
const a = 100
a = 200 //报错
3.暂时性死区
//暂时性死区
var PI = "a"
if (true) {
console.log(PI) //报错
const PI = "3.14159"
}
//const暂时把if当做一个作用域 封锁了 不能找到外面的PI
4.适用于不会变的业务中 其他同let
5.const 修饰obj对象可以添加成员 没改变obj对象
const obj = {}
obj.age = 20
console.log(obj)
练习:
<script>
//笔试题 严格模式相关 了解
console.log(b)
console.log(fn)
if (true) {
var b = 100
function fn() {}
}
//尽量不要在if里面声明函数 要用就用let
总结:
- var声明变量可以重复声明,而let不可以重复声明
- var是不受限于块级的,而let是受限于块级
- var会与window相映射(会挂一个属性),而let不与window相映射
- var可以在声明的上面访问变量,而let有暂存死区,在声明的上面访问变量会报错
- const声明之后必须赋值,否则会报错
- const定义不可变的量,改变了就会报错
- const和let一样不会与window相映射、支持块级作用域、在声明的上面访问变量会报错
- let 和const 关键词声明的变量不具备变量提升(hoisting)特性
- let 和 const 声明只在最靠近的一个块中(花括号内)有效
- 当使用常量 const 声明时,使用大写变量,如:CAPITAL_CASING