返回

难住百万程序员的变量提升变态面试题:你能解决吗?

前端

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