第一章 块级绑定
var 声明与变量提升
var 声明的变量,无论声明位置在何处,都会被视为在函数顶部声明(不在函数内,在视为在全局作用域),这称为变量提升。
function getValue(condition) {
//var value; 声明提到顶部
if (condition) {
var value = "blue"; // value = "blue"; 初始化
return value;
} else {
//这里也可以访问value,只是未被初始化,值为undefined
return null;
}
// 同理 这里也可以访问value
}
块级声明
即作用域范围,
1 在一个函数(function)内部
2 在一对花括号({})包裹的代码块内部。
let 声明
与其它语言相似,声明的变量只在当前作用域内生效,需在顶部声明变量。
禁止重复声明
同作用域内,禁止重复声明(let)同一个变量,可在嵌套的作用域内声明。
常量声明
使用 const 声明的变量视为常量(内存地址固定),变量需要声明时初始化,仅在当前作用域内生效,同样禁止重复声明(包括其它声明)。
const 阻止的是改变指针,因此改变对象的属性并不会报错。
暂时性死区
指变量被声明(let/const)前的区域,变量声明前被访问会报错。
if (true) {
// 暂时性死区,不能访问value
let value = 'red'
}
循环内声明
var 声明在循环(for)中由于会变量提升,在循环中创建的变量可在作用域之外访问。而 let 和 const 声明在每次循环中会创建新的变量,循环内函数获得不同的副本,const 声明在 for 循环中使用时,因为“i++”会改变常量,会报错,但 for-in 没有改变常量(每一次都是创建新的变量),所以不会报错。
全局块级绑定
全局作用域下,使用 let 和 const 声明的变量不会覆盖全局属性。
块级绑定新的最佳实践
默认情况使用 const,变量值需要改变使用 let。