- ECMAScript中的变量是松散的,每个变量只不过是一个保存任意值的“占位符”
- 3个关键字可以声明变量:
var、const、let,后两个只能在ES6+版本中使用
var
- 用法:var关键字后跟变量名
- 变量未初始化时,默认值为
undefined - 初始化变量时,只是简单的赋值,并不会将其标识为相应的数据类型
- 关于作用域的问题:
在函数内部使用var关键字声明的变量,会成为该函数的局部变量,在函数调用结束后被立即销毁,去掉关键字var后,该变量成为全局变量,但不建议这样做 - Tip:严格模式下,给未声明的变量赋值会引发 ReferenceError 错误
- 一条语句中定义多个变量时,变量间使用逗号分隔
- Tip:严格模式下,不能将变量命名为
eval和arguments - 使用var声明的变量会自动提升(hoist)到函数作用域顶部
- 多次使用var声明同一个变量不会出现问题
let
- 与var声明的函数作用域不同,let声明的是块作用域
- 不允许同一个块中出现冗余声明
- 暂时性死区
let声明的变量不会中作用域中被提升,声明之前的执行瞬间称为“暂时性死区”(temporal dead zone),在此阶段引用任何后面声明的变量都会抛出 ReferenceError - 在全局作用域中使用var声明的变量会成为window对象的属性,而使用let声明则不会
- 条件声明
let声明的变量被限制在该块中,不能像var声明那样使用try-catch或typeof来进行条件声明
- 在for循环中的使用var声明循环变量时,变量会渗透到循环外面,而使用let声明时,循环变量就仅限于循环内部
- 同时,使用let声明变量也能避免一些奇怪的修改(JavaScript引擎会为for循环中的let声明分别创建独立的变量实例)
const
- 使用const声明的变量的行为与let声明的变量的行为基本相同,唯一的不同就是变量声明的同时必须初始化
- 修改const声明的变量会导致错误,因此,不能用其声明迭代变量
最佳实践
- 既然声明变量的方式这么多,那么如何选择就是个问题了,一般遵循的原则:
不使用var、const优先、let次之
浙公网安备 33010602011771号