面试题答案
一键面试变量声明提升规则
在JavaScript函数作用域中,变量声明会被提升到函数作用域的顶部,但变量的赋值不会提升。这意味着在变量声明语句之前就可以使用该变量,然而此时变量的值为undefined
,因为赋值操作仍在原位置执行。
函数内部变量不同位置访问情况举例
function test() {
console.log(a); // 输出: undefined
var a = 1;
console.log(a); // 输出: 1
}
test();
在上述例子中,变量a
的声明被提升到函数顶部,但赋值语句仍在原来位置。所以第一次console.log(a)
时,变量a
已声明但未赋值,输出undefined
;第二次console.log(a)
时,变量a
已赋值,输出1
。
再看一个包含块级作用域(ES6之前JavaScript没有真正块级作用域概念,这里以{}
模拟)的例子:
function test2() {
console.log(b); // 输出: undefined
if (true) {
var b = 2;
console.log(b); // 输出: 2
}
console.log(b); // 输出: 2
}
test2();
这里虽然b
的声明在if
块内,但由于JavaScript函数作用域特性,b
的声明提升到函数顶部。所以在if
块外也能访问到b
,并且if
块内外访问的是同一个变量b
。