块级声明

块级作用域在一下情况被创建:

  • 一个函数内部
  • 一个代码块

$let$ 声明与 $var$ 的语法一致,但会将变量的作用域限制在当前代码块中, $let$ 声明不会提升变量所以需要手动将 $let$ 声明放置在顶部以便让变量在整个代码块内部可用。

$let$ 声明的特点:

  • 没有变量提升
  • $let$ 不能再当前作用域重复声明任何已有的变量

$ES6$ 中使用 $const$ 声明常量,常量的值在被设置后不可改变,所以所有的常量需要在声明时进行初始化, $const$ 声明也是块级作用域。

$js$ 常量如果是一个对象,它所包含的值是可以被修改的(不变的是对象的引用地址)

$const$ 声明会阻止对于变量绑定与变量自身值得修改,但并不会阻止对变量成员的修改

1
2
3
4
5
6
7
8
9
const person = {
name:"Autumn"
};

person.name = "Other"; // 可以修改对象中的属性

person = {
name="Other"; // 该操作抛出错误,因为这在修改变量的绑定
}

暂时性死区:

未声明变量之前,任何对变量的访问都将抛出错误,包括对变量使用 $typeof$ 操作符。

循环內的函数:

1
2
3
4
5
6
7
8
9
var arr = [];

for(var i=0;i<10;i++){
arr.push(function(){console.log(i);});
}

arr.forEach(function(func){
func(); //这里会输出数值“10”十次
});

上段代码我们预期的结果是输出 $0-9$ 的数值,但事实并非如此,解决办法是闭包或更简单 $let$ 声明。

循环内的常量声明:

在 $for$ 循环中不可以使用$const$声明,因为在执行 $i++$ 的时候会报错,但是在 $for…in$ 与 $for…of$ 中可以使用。因为循环为每次迭代创建了一个新的变量绑定,而不是去修改已绑定的变量的值。

全局块级绑定:

在全局作用域中使用 $var$ 声明可能会覆盖已有的全局属性,而 $let$ 或 $const$ 虽然会在全局作用域上创建新的变量但不会在全局对象绑定该变量,这就意味着不能使用 $let$ 或 $const$ 覆盖全局变量,只能将其屏蔽。