一.var
在
ES5
中,顶层对象的属性和全局变量是等价的,⽤
var
声明的变量既是全局变量,也是顶层变量
注意:顶层对象,在浏览器环境指的是
window
对象,在
Node
指的是
global
对象
(1)使⽤
var
声明的变量存在变量提升的情况
(2)使⽤
var
,我们能够对⼀个变量进⾏多次声明,后⾯声明的变量会覆盖前⾯的变量声明
(3)在函数中使⽤使⽤
var
声明变量时候,该变量是局部的
var a = 100
function change(){
var a = 50
}
change()
console.log(a) // 100
如果在函数内不使⽤
var
,该变量是全局的
var a = 20
function change(){
a = 30
}
change()
console.log(a) // 30
二.let
let
是
ES6
新增的命令,⽤来声明变量
⽤法类似于
var
,但是所声明的变量,只在
let 命令所在的代码块内有效,不存在变量提升
let 不允许在相同作⽤域中重复声明,注意的是相同作⽤域,下⾯这种情况是不会报错的
let a = 50
{
let a = 100
}
三.const
const 声明⼀个只读的常量,⼀旦声明,常量的值就不能改变,这意味着,
const
⼀旦声明变量,就必须⽴即初始化,不能留到以后赋值。
如果之前⽤
var
或
let
声明过变量,再⽤
const
声明同样会报错
const
实际上保证的并不是变量的值不得改动,⽽是变量指向的那个内存地址所保存的数据不得改动
对于简单类型的数据,值就保存在变量指向的那个内存地址,因此等同于常量
对于复杂类型的数据,变量指向的内存地址,保存的只是⼀个指向实际数据的指针,
const
只能保证这
个指针是固定的,并不能确保改变量的结构不变
const foo = {};
// 为 foo 添加⼀个属性,可以成功
foo.prop = 123;
foo.prop // 123
// 将 foo 指向另⼀个对象,就会报错
foo = {}; // TypeError: "foo" is read-only
其它情况,
const
与
let
⼀致
变量提升
var
声明的变量存在变量提升,即变量可以在声明之前调⽤,值为
undefined
let
和
const
不存在变量提升,即它们所声明的变量⼀定要在声明后使⽤,否则报错
暂时性死区
暂时性死区指的是在被let或const定义的变量,在该变量被声明之前无法被访问,会报错