let const
es 6
Block Bindings(块绑定) let 声明
块声明(块级作用域)的两种形式
1 在一个函数内;
2 在一个大括号({})内
块声明与var声明不同
1 var声明有变量声明提升的过程 块声明不存在变量声明提升
2 var 声明的变量可以再次声明 块声明不可以 报错
例子1
if(condition){
var a = 12;
}
无论condition的值被解析为true 还是false 在循环体之外都可以可以访问到a这个变量
原因 js有一个预编译过程 也就是变量声明提升的过程 js会在执行代码之前把var声明的变量提升到当前作用域的顶端可以理解为
var a; //默认赋值为undefined
if(condition){
a = 12;
}
if(condition){
console.log(a) //报错
let a = 12;
}
let声明的变量 没有变量声明提升这个过程
也就是说 在声明let a = 12之前 不能访问到a 报错
例子2
if(condition){
var count = 30;
// Syntax error
let count = 40;
}
如果一个变量已经声明了 在let声明的范围之内再次声明会导致错误发生
例子3
var count = 30;
if (condition) {
let count = 40;
}
这种结构的不会导致错误发生 几个问题
1 在let声明之前不能访问到 count 暂时性死区
2 在let声明之后 设置 count = 41; 不影响外围的count 相当于不同的同名变量
3 进入if语句中 因为定义了一个新的count变量 此count 非全局count
总结let
- let 定义的变量只存在当前作用域的函数代码块中
- 暂时性死区 在let声明之前不能访问到此变量 会发生错误
- let声明不能重新定义 会发生错误
- let 声明的全局对象 不挂载到window上 let a = 12; window.a = 2; window.a !== a
常量声明 const
const obj = {
name: "lxk"
}
obj.age = 21;
//不会报错 因为obj是一个指针 现在指针没有变 变得是指针指向的值 发生了改变
obj = {
name: "lxk"
}
//报错 指针现在指向了一个新的内存区
- 同let声明一样 都存在块级作用域 不能重复声明 暂时性死区
- 赋值之后不可以修改 此常量的值
- 常量声明时 必须赋值
- for 循环中 创建了多个i的副本 好找到当前的i
let const 暂时性死区
例:
typeof name; ==>报错 暂时性死区
let name = ‘js’;
对比
typeof age; ‘undefined’ 访问了未定义的变量
const 声明一个常量
const MAX_LENTH ==> 语法错误
声明一个常量必须要赋值
const 声明的常量值 不可以再改变
如果是一个对象的话 可以修改属性
如果是一个数组的话 可以添加 删除项
理解为
Const 声明一个常量
基本类型 值不可改变
复杂类型 指针不可以改变
var 和 const let区别
var name = 12;
‘name’ in window ==> true
let age = 12; // const 同理
‘age’ in window ==> false
重点推荐: 默认使用const 只有确实需要改变变量的值的时候使用let
浙公网安备 33010602011771号