变量声明
let和const是JavaScript里相对较新的变量声明方式。
let在很多方面与var是相似的,但是可以帮助大家避免在JavaScript里常见一些问题。
const是对let的一个增强,它能阻止对一个变量再次赋值。
-
作用域规则
var作用域 或 函数作用域:var声明可以在包含它的函数,模块,命名空间或全局作用域内部任何位置被访问。函数参数也使用函数作用域。 -
作用域规则可能会引发一些错误:
① 多次声明同一个变量并不会报错。
②for循环会覆盖变量i,因为所有i都引用相同的函数作用域内的变量。 -
捕获变量怪异之处
let声明
-
块作用域 ① 当用let声明一个变量,它使用的是词法作用域或块作用域。
② 不同于使用 var声明的变量那样可以在包含它们的函数外访问,块作用域变量在包含它们的块或for循环之外是不能访问的。
③ 不能在被声明之前读或写。
虽然这些变量始终“存在”于它们的作用域里,但在直到声明它的代码之前的区域都属于暂时性死区。
-
**重定义及屏蔽
**① 使用var声明时,它不在乎你声明多少次;你只会得到1个。
② 块级作用域变量需要在明显不同的块里声明。
③ 在一个嵌套作用域里引入一个新名字的行为称做屏蔽。通常来讲应该避免使用屏蔽,因为我们需要写出清晰的代码。
-
**块级作用域变量的获取
**① 获取用var声明的变量时,每次进入一个作用域时,它创建了一个变量的 环境。 就算作用域内代码已经执行完毕,这个环境与其捕获的变量依然存在。
② 当let声明出现在循环体里时拥有完全不同的行为。 不仅是在循环里引入了一个新的变量环境,而是针对每次迭代都会创建这样一个新作用域。
const声明
拥有与 let相同的作用域规则,但是不能对它们重新赋值。
let vs. const
使用选择:依情况而定。
使用最小特权原则,所有变量除了你计划去修改的都应该使用const。
基本原则就是如果一个变量不需要对它写入,那么其它使用这些代码的人也不能够写入它们,并且要思考为什么会需要对这些变量重新赋值。
使用 const也可以让我们更容易的推测数据的流动。