作用域:函数作用域和块作用域

作用域单元

作用域单元分为函数作用域和块作用域,使用作用域的目的是将变量单独定义在作用域内,防止变量污染,变量的声明应该距离是用地越近越好,并且最大限度的实现本地化。

为什么要创建块作用域

例如代码如下:
1
2
3
4
5
6
7
8
9
10
if (true) {
var bar = 2
}
console.log(bar) // 2


for (var i =0 ;i < 10; i++) {
console.log(i)
}
console.log(i);
在上面的代码中,使用了 var 声明变量,当我们这个变量只在 if 或者 for 代码块中使用的时候,使用 var 声明变量容易造成变量污染,后续开发人员声明变量的时候还要避免声明同样的变量。使用快作用域的作用是:在代码块中被声明的变量只在代码块中使用,不会污染到全局变量。这就需要我们创建块作用域。

创建块作用域的几种方式

1.try catch 语句会在 catch 语句中创建一个块作用域
1
2
3
4
5
6
7
try {
consolel.log(a);
}
catch (err) {
console.log(err.name); // 抛出错误的名字
}
console.log(err.name) // err is not defined
声明的catch 内变量只在 catch 语句内部被使用到2.let 会为声明的变量隐式的创建块作用域
1
2
3
4
if (true) {
let bar = 2
}
console.log(bar)// bar is not defined
通过使用 let 将声明的变量隐式的绑定到 if 语句上,在外部是不可访问到的。也可以通过使用 { } 来显式的为 let 声明一个用于绑定的块:
1
2
3
4
5
6
7
if () {
let bar = 2;
{
let foo = 3;
}
console.log(foo); // foo is not defined
}
使用 let 可以创建作用域,相对于使用 var 而言,var 会将变量定义到全局作用域中,使用 let 定义变量会被定义到隐式的块状作用域,因此,依赖变量的函数也要放到定义的块状作用域内。3.使用 const也可以创建块状作用域,使用 const 创建的是常量,试图修改会导致错误:
1
2
3
4
if (true) {
const a = 2;
}
console.log(a) // a is not defined

总结

使用 var 定义的变量会被定义到全局变量中,使用let 可以创建块状作用域,使用let定义的变量依赖的函数要和声明的变量放在同一个作用域;使用 {} 可以声明显式的作用域;