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># let1. **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 声明时候必须要赋值
