面试题答案
一键面试-
第一段代码
outer
函数的输出及分析:- 输出:
- 首先输出
2
。 - 然后输出
1
。
- 首先输出
- 分析:
- 在
outer
函数中,使用let
声明变量。let
具有块级作用域。在if (true)
代码块中,let x = 2;
创建了一个新的块级作用域变量x
,这个变量仅在该代码块内有效。所以console.log(x);
在这个块内输出2
。 - 而函数外层的
let x = 1;
与块内的x
是不同的变量(因为块级作用域的隔离)。所以在块外的console.log(x);
输出的是外层声明的x
的值1
。let
不存在变量提升,在声明之前访问会导致ReferenceError
。
- 在
- 输出:
-
第二段代码
outer2
函数的输出及分析:- 输出:
- 首先输出
2
。 - 然后输出
2
。
- 首先输出
- 分析:
- 在
outer2
函数中,使用var
声明变量。var
没有块级作用域,只有函数作用域。var y = 2;
虽然写在if
块内,但由于var
的特性,它实际上提升到了函数的顶部(变量提升)。所以在if
块内和块外访问的y
是同一个变量。 - 变量提升使得
var y
在函数开始时就被声明,但是赋值语句y = 1;
和y = 2;
还是在它们原本的位置执行。先执行y = 1;
,然后在if
块内执行y = 2;
,所以两个console.log(y);
都输出2
。
- 在
- 输出: