ECMAScript 变量是松散类型的,意思是变量可以用于保存任何类型的数据。每个变量只不过是一
个用于保存任意值的命名占位符。有3 个关键字可以声明变量:var、const 和let。其中,var 在
ECMAScript 的所有版本中都可以使用,而const 和let 只能在ECMAScript 6 及更晚的版本中使用。
var
定义变量
var message;
var message = 123;
var 的两个特性
- var 声明作用域
- var 具有变量提升 ```javascript // 1.声明作用域 function test() { var message = ‘hi’; // 局部变量 } test(); console.log(message); // 出错
// 2. var 的变量提升 function foo () { console.log(age); // 变量提升 var age = 22; } foo() // undefined
// 以上代码等价为 function foo () { var age; console.log(age); // 变量提升 age = 22; } foo() // undefined
<a name="vGXj1"></a>
# let
1. **let具有块级作用域**
2. **不能重复声明**
3. **不能和var混合使用**
4. **没有变量提升**
```javascript
//1. 块级作用域
{
let a = 'message';
}
console.log(a);
// 2. 不能重复声明
let a = 'a';
let a = 'a'; // SyntaxError
// 3. 不能和var 混用
let name = 'yellowsea';
var name = 'yellowsea'; // SyntaxError
// 4. 没有变量提升
console.log(name); // 没有声明
let name = 'yellowsea';
// 5. let 没有全局声明
var name = 'yellowsea';
console.log(window.name); // 'yellowsea'
let age = 26;
console.log(window.age); // undefined
for循环使用let为迭代变量
// 使用var为迭代变量
for (var i = 0; i < 5; i++) {} // 迭代遍历会渗透到循环体外部
console.log(i); // 5
// 改用let 为迭代变量
for (let i = 0; i < 5; i++) {}
console.log(i); // i 没有定义
var 和 let 常见的情况
for (var i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i)
}, 0)
}
// 立即输出 5 5 5 5 5
之所以会这样,是因为在退出循环时,迭代变量保存的是导致循环退出的值:5。在之后执行超时 逻辑时,所有的i 都是同一个变量,因而输出的都是同一个最终值。
for (let i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i)
}, 0)
}
// 输出 0, 1, 2, 3, 4,
而在使用let 声明迭代变量时,JavaScript 引擎在后台会为每个迭代循环声明一个新的迭代变量。 每个setTimeout 引用的都是不同的变量实例,所以console.log 输出的是我们期望的值,也就是循 环执行过程中每个迭代变量的值。
const
- const 定义变量不允许修改
- 不能重读声明
- 具有块级作用域
- const 定义的对象可以修改属性值
- const声明变量必须赋值
// 1. const 定义的变量不允许修改
const NAME = "Yellowsea";
NAME = "Hidie"; // TypeError
// 2. const 定义的变量不允许重复声明
const NAME = 'TEST';
const NAME = 'test'; // SyntaxError
// 3. const 具有块级作用域
{
const NAME = 'TEST';
}
const NAME = 'test';
//4. const 定义的对象可以修改属性值
const YELLOWSEA = {
name: 'Yellowsea',
age: 123
}
YELLOWSEA.age = 456;
console.log(YELLOWSEA) // { name: 'Yellowsea', age: 456 }
// 5. const声明变量必须赋值
const age; // SyntaxError
声明变量的风格
const > let > var
var let const 的区别
- 变量提升
- 块级作用域
- 重复声明 -> var 可以重复声明 , let const 不能重复声明变量
- 暂时性死区 -> 暂时性死区: 使用const 和 let 定义变量之前, 该变量都是不可用的。 在语法上成为暂时性死区。
- let 和 var 可以声明是不用赋值, const 声明时候必须要赋值