1、var声明及变量提升(Hoisting)机制
在函数作用域或全局作用域中通过关键字var声明的变量,无论实际上是在哪里声明的,都会被当成在当前作用域顶部声明的变量,这就是我们常说的提升(Hoisting)机制。例如:
function getValue(condition){
if(condition){
var value = "blue";
return value;
}else{
//此处可访问变量value,其值为undefined
return null;
}
//此处可访问变量value,其值为undefined
}
在预编译阶段,JavaScript引擎会将上面的getValue函数修改成下面这样:
function getValue(condition){
var value; //变量声明被提升到函数顶部
if(condition){
value = "blue";
return value;
}else{
return null;
}
}
变量value的声明被提升至函数顶部,而初始化操作依旧留在原处执行,这就意味着在else子句中也可以访问到该变量,且由于此时变量尚未初始化,所以其值为undefined。
2、块级声明let
块级声明用于声明在指定块的作用域之外无法访问的变量。块级作用域存在于:
- 函数内部
- 块中(字符 “{” 和 “}” 之间的区域)
let 声明的用法和var相同。用let代替var来声明变量,就可以把变量的