重复声明 | 变量提升 | 暂时性死区 | window 对象的属性和方法 | 块级作用域 | |
---|---|---|---|---|---|
解释 | 已经存在的变量或常量,又声明了一遍 | 提升变量的声明到当前作用域的顶部 | 只要作用域内存在 let、const,它们所声明的变量或常量就自动“绑定”这个区域,不再受到外部作用域的影响 | 全局作用域中,var 声明的变量,通过 function 声明的函数,会自动变成 window 对象的属性或方法 | 作用域链:内层作用域->外层作用域->...->全局作用域 |
let | 不允许 | 不存在 | / | 不会变成 | 有 |
const | 不允许 | 不存在 | / | 不会变成 | 有 |
var | 允许 | 存在 | 没有 | / | 没有 |
var关键字
1.var声明作用域
使用var操作符定义的变量会成为包含它的函数的局部变量。该变量将在函数退出时被销毁。 But,在函数内定义变量时省略var,可以创建一个全局变量,可在函数外部被访问到(不推荐)。
2.var声明提升
使用var声明的变量会自动提升到函数作用域顶部
let声明
let 和var最明显的区别:let声明的范围是块级作用域,而var声明的范围是函数作用域。(块级作用域是函数作用域的子集)
1.暂时性死区
let不会变量提升,在let声明之前执行瞬间被称为“暂时性死区”
2.全局声明
与var不同,使用let在全局作用域中声明的变量不会成为windows对象的属性
3.for循环中的let声明
使用let,迭代变量的作用域仅限于for循环内部
const声明
const的行为与let基本相同。重要的的区别是用const声明变量时,必须同时初始化变量
-
一定要赋初始值
const A;
//报错 -
常量的值不能修改
const TEAM = 'livepool'; TEAM = 'BACA';
//报错 -
块级作用域
-
对于数组和对象的元素修改,不能算作对常量的修改,不会报错
const TEAM = ['MESSI','SUAREZ','NEYMAR'];TEAM.push('VIDAL');
//不报错