var的声明提升
var声明及其变量提升:变量的声明提升到函数顶部,但是初始化依旧停留在原地执行。(详情参考js预编译文章)
function A(){
if(true){
var a = 10;
}
}
//预编译阶段变量提升:
function A(){
var a;
if(true){
a = 10;
}
}
块级声明
块级声明用于声明指定块的作用域之外无法访问的变量:
- 函数内部
- 块中({}之间的区域)
let
- let声明不被提升,可以把变量的作用域限制在当前代码块中。
- 作用域已存在某个标识符,再使用let声明它就会抛出错误
function A(){
if(true){
let a = 10;
//其他代码
}else {
//a在此处访问不到
var b = 1;
let b = 2;//错误,b已被声明
}
}
const
- 声明常量,不可被更改。
- 声明同时必需初始化,否则抛出错误。
- 作用域已存在某个标识符,再使用let声明它就会抛出错误。
- 如果声明的常量是个对象,这个对象内的值可以被更改。(即不能修改对象的绑定,但能修改对象的值)
let,const的临时死区(Temporal Dead Zone,TDZ)
-当js引擎扫描代码预编译时,发现let声明的变量,把他放到TDZ中,只有执行过变量声明后,才会从TDZ中移出,才能正常访问。
typeof b;//undefined,因为不存在b
function A(){
typeof a;//打印错误,因为在当前作用域中,a在TDZ中,所以会错误
let a = 1;
}