var
var定义的变量,没有块的概念,可以跨块访问, 不能跨函数访问。
如果在声明变量时,省略 var 的话,该变量就会变成全局变量,如全局作用域中存在该变量,就会更新其值
-
var a = 1; //此处声明的变量a为全局变量
-
function foo(){
-
a = 2;//此处的变量a也是全局变量
-
console.log(a);//2
-
}
-
foo();
-
console.log(a);//2
注意:var 声明的变量存在提升(hoisting)。
提升
提升是指无论 var 出现在一个作用域的哪个位置,这个声明都属于当前的整个作用域,在其中到处都可以访问到。注意只有变量声明才会提升,对变量赋值并不会提升。如下例所示:
console.log(a);//undefined
var a = 1;
2.let
let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问。
- 在同一个块级作用域,不能重复声明变量。
- let 声明的变量不存在变量提升,换一种说法,就是 let 声明存在暂时性死区(TDZ
3.const
const用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改。
所以准确的说,是 const 声明创建一个值的只读引用。但这并不意味着它所持有的值是不可变的,只是变量标识符不能重新分配。