变量 | var let const区别及应用
1. var
(1)var声明作用域
使用var操作符定义的变量会成为包含它的函数的局部变量,换句话说var声明的变量的作用域是它当前的执行上下文及其闭包
局部变量说明:在函数调用完之后会被销毁
1 | function test() { |
(2)var声明提升
var声明的变量会自动提升到作用域顶部
1 | console.log(message); // undefined |
2. let
(1)块级作用域
let声明的范围是块级作用域,var声明的范围是函数作用域
1 | if (true) { |
(2)不允许重复声明
let不允许在同一个块作用域中出现冗余声明,注意是同一块级作用域!
1 | var name; |
(3)暂时性死区
let声明的变量不会在作用域中提升
暂时性死区:在let声明之前不允许任何方式来引用未声明变量,会抛出错误ReferenceError
1 | // name会被提升 |
(4)全局声明
let声明的变量不会成为window对象的属性,而var会
1 | var name = 'Matt'; |
3. const
const具有let的以上行为
(1)声明即初始化
const声明变量时必须同时初始化
(2)声明后不允许改变
const声明后为常量,不允许改变
const声明的限制只适用于它指向的变量的引用
1 | const person = {}; |
4. 面试题
(1)for循环中的let声明
循环泄漏问题
1
2
3
4
5
6
7
8
9
10for (var i = 0; i<5; i++) {
// 循环逻辑
};
console.log(i); // 5
for (let i = 0; i<5; i++) {
// 循环逻辑
};
console.log(i); // i is undefined迭代变量的奇特声明和修改
1
2
3
4
5
6
7
8
9for (var i = 0; i < 5; i++) {
setTimeout(() => console.log(i), 0);
};
// 5 5 5 5 5
for (let i = 0; i < 5; i++) {
setTimeout(() => console.log(i), 0);
};
// 0 1 2 3 4