一、问题

console.log(a);
var a = 1;
var a = function(){
console.log(2);
}
function a(){
console.log(3);
}
console.log(a);


二、解决

1. 变量声明提升

var a = 10;

等于

// 预编译
var a; // 声明会被提到当前作用域的顶端
// var的作用域只有两种,全局作用域和函数作用域
...
// 执行阶段
a = 10; // 赋值语句位置不变


2. 函数声明提升


function f() {
console.log('function');
}

等于

// 预编译
var f;
f = function () {
console.log('function');
};
...


3. 变量提升和函数声明提升冲突

console.log(a); // f a(){console.log('function');}
var a = 10;
function a() {
console.log('function');
}
console.log(a); // 10


等于

    // 函数声明优先

var a; // 函数a
a = function(){
console.log('function');
}

var a; // 变量a, var是可以重复声明的,且不影响已经赋的值

console.log(a); // f a(){console.log('function');}

a = 10;

console.log(a); // 10


4. 函数声明和函数表达式冲突(跟3一样)

// 函数声明
function f(){
console.log('function');
}

// 函数表达式(变量式声明)
// 函数表达式定义的函数必须先声明后调用,不然报错a is not define
var f = function(){
console.log('var');
}

三、实际面试题

console.log(a); // f a(){console.log(3)}
var a = 1;
var a = function () {
console.log(2);
}
function a() {
console.log(3);
}
console.log(a); // f a(){console.log(2)