在一次笔试中碰到,得到面试官的指导。
题目大概是这样:

var a = 10;
function test(){ 
  a = 1;
  console.log(a); 
  var a;
  console.log(a); 
}

test();   // 1  1
console.log(a); // 10

在test函数中,先 var a; 单纯的变量声明,会在同级函数中进行声明提前, 类似于 function 可以放到执行时的后面一样, 所以 test()中 a 声明为了一个局部变量,相当于 var a; a = 1; 操作。

变化与思考:

var a = 10;
function test(){ 
  a = 1;
  console.log(a); 
  var a = 20;
  console.log(a); 
}

test();   // 1  20
console.log(a); // 10

发现没? var a = 20 这部分相当于完成了两个操作, 1: 声明提前,将 a 设置为局部变量, 2:当执行到var a = 20时, 将a赋值为20。

验证:

var a = 10;
function test(){ 
  console.log(a); 
  var a;
  console.log(a); 
}

test();   // undefined undefined  
console.log(a); // 10

var a 声明提前,但没有赋值, 所以 undefined。

var a = 10;
function test(){ 
  console.log(a); 
  var a = 1;
  console.log(a); 
}

test();   // undefined 1  
console.log(a); // 10

同样的思路: 声明提前,a为局部变量,一开始未赋值, 为 undefined,后面赋值为 1