返回
难住百万程序员的变量提升变态面试题:你能解决吗?
前端
2023-11-06 01:22:30
1. 老版本浏览器下:
var a = 1;
console.log(a); // 1
function test() {
console.log(a); // undefined
var a = 2;
}
test();
解析:
在老版本的浏览器中,变量提升会将变量声明提升到函数的顶部。因此,在test()
函数中,a
变量被提升到了函数顶部,但此时a
变量还没有被赋值,因此它的值是undefined
。当console.log(a)
被执行时,它输出undefined
。
2. 新版本浏览器
let a = 1;
console.log(a); // 1
function test() {
console.log(a); // ReferenceError: a is not defined
let a = 2;
}
test();
解析:
在新的浏览器中,变量提升仍然会发生,但是let
变量和const
变量不会被提升到函数顶部。因此,在test()
函数中,a
变量没有被提升,当console.log(a)
被执行时,它会抛出一个ReferenceError
错误。
3. 题
var a = 1;
function test() {
var a = 2;
console.log(a); // 2
if (true) {
var a = 3;
console.log(a); // 3
}
console.log(a); // 2
}
test();
解析:
在这个例子中,a
变量在函数test()
中被声明了两次。第一次声明在函数顶部,第二次声明在if
语句中。由于var
变量会被提升到函数顶部,因此在函数中任何地方都可以访问到a
变量。当console.log(a)
被执行时,它输出2
,因为a
变量的值在if
语句中被重新赋值为3
。
4. 题
var a = 1;
function test() {
console.log(a); // 1
var a = 2;
function inner() {
console.log(a); // 2
var a = 3;
console.log(a); // 3
}
inner();
console.log(a); // 2
}
test();
解析:
在这个例子中,a
变量在函数test()
中被声明了两次,一次在函数顶部,一次在内部函数inner()
中。由于var
变量会被提升到函数顶部,因此在函数test()
中任何地方都可以访问到a
变量。在函数inner()
中,a
变量也被声明了两次,一次在函数顶部,一次在内部作用域中。由于var
变量会被提升到函数顶部,因此在函数inner()
中任何地方都可以访问到a
变量。当console.log(a)
被执行时,它输出2
,因为a
变量的值在函数inner()
中被重新赋值为3
。