块级绑定

Wednesday, August 21, 2019

第一章 块级绑定

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。