let和var的区别面试题答案

这里对之前的一篇博客做出解释

博客地址: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>`

猜你喜欢

转载自blog.csdn.net/m0_56026872/article/details/118001518