关于 var 和 let 的变量提升问题
思考题 1
showName();
var showName = function() {
console.log(2);
};
function showName() {
console.log(1);
}
打印结果是:
1
原因:用 var
定义的变量存在 定义
和 初始化
的提升,使用关键字 function
定义的函数存在函数 定义
、初始化
以及 赋值
的提升。所以实际的过程如下:
var showName;
showName = undefined
function showName() {
console.log(1);
}
showName();
showName = function() {
console.log(2);
};
如果改成这样:
var showName = function() {
console.log(2);
};
function showName() {
console.log(1);
}
showName();
则打印结果是:
2
思考题 2
let myName = "geek time";
{
console.log(myName);
let myName = "Hei ha";
}
打印结果是:
Uncaught ReferenceError: Cannot access 'myName' before initialization
原因:这种情况称作 暂时性死区
,使用 let
声明的变量只存在 定义
的提升,而不存在 初始化
的提升,而 {}
又是一个块级作用域,所以打印的代码会优先在当前执行上下文里面找变量 myName
。具体过程如下:
let myName = "geek time";
{
let myName
console.log(myName);
myName = "Hei ha";
}
需要注意的是,上面的代码运行后并不会报错,而是会打印出 undefined
,因为使用 let
定义的变量是可以再次赋值的,所以即使在定义时没有显示地赋值也没有关系,会默认赋值 undefined
。
另外 const
存在着和 let
同样的 暂时性死区
的现象,但 const
定义的变量是一个常量,不能二次赋值,所以在定义时就必须进行初始化,否则会报错,如下:
const name // Uncaught SyntaxError: Missing initializer in const declaration