这里对之前的一篇博客做出解释
博客地址:let和var的区别,几个小面试题
第一题:
console.log(dog); //undefined
var dog = "小狗"
console.log(cat); //Error: Cannot access 'cat' before initialization
let cat = "小猫"
解释:
第一个输出,是因为var声明的变量会产生变量提升,简单来说就是变量经过预解析的过程,会先被赋值为undefined。
第二个报错,是因为let声明的变量不存在变量提升
第二题:
第1组
var dad = '我是爸爸!'
console.log(dad); //我是爸爸!
var dad = '我才是爸爸!'
console.log(dad); //我才是爸爸!
第2组
let son = '我是儿子!'
console.log(son); //我是儿子!
let son = '我才是儿子!'
console.log(son); //Error: 'son' has already been declared
解释:
第一组可以正常输出,是因为var声明的变量可以重复声明
第二个报错,是因为let声明的变量不允许重复声明
第三题
{
let a = 1;
{
// 块级作用域
let b = 2;
console.log(a); // 1
}
console.log(b); // b is not defined
}
解释:
第一个输出,是因为当前块级作用域没有a这个变量,会自动向上一级作用域查找,上级作用域中的a被赋值了1
第二个报错,是因为let声明的变量会自动生成块级作用域,b是块级作用域声明的变量,外层作用域无法访问
第四题
for (let i = 0; i < 3; i++) {
console.log(i); // 1 2
}
console.log(i); //Error: i is not defined
解释:
第一个输出,是因为for循环里let声明的变量会自动生成块级作用域,i是块级作用域声明的变量,在该块级作用域内可以正常访问
第二个报错,是因为超出了i所在的块级作用域
第五题
第1组
var monkey = '我是美猴王!';
{
console.log(monkey); // 我是美猴王!
var monkey = '我是六耳猕猴';
}
console.log(monkey); //我是六耳猕猴
第2组
let monkey = '我是美猴王!';
{
console.log(monkey); // Error: Cannot access 'monkey' before initialization
let monkey = '我是六耳猕猴';
}
console.log(monkey); //我是美猴王!
解释:
第一组可以正常输出,是因为var声明的变量不存在块级作用域
第二个报错,是因为ES6规定当我们在一个块级作用域中使用let和const来声明变量时,这个变量一开始就会形成一个封闭的作用域,也就是说即使向上的作用域中存在这个同名变量我们也无法访问到
这里要注意区分在函数作用中var 与let的区别,代码如下
<script>
let a = 1;
(function () {
console.log(a); //这里会报错
let a = 2;
})();
</script>`