1.变量提升
console.log(a); //undefined
var a = 1;
过程:
var a; //a的声明跑这里了 赋值地方不动
console.log(a);
a = 1;
如果是这样呢?
console.log(a); //Error:a is not defined
a = 1;
结果是会报错,a=1并没有var,他自己跑不上去。
2.函数提升
a();
function a() {
console.log(a);
}
这个例子不是很恰当,执行顺序如下:
function a() {
console.log(a);
}
a();
函数整个提升了,打印结果是函数a,函数有作用域,在函数a中找不到a,向全局中找的a。
如果是这样的呢,
consloe.log(a); //undefined
a(); //Error: a is not a function
var a = function () {
console.log(a);
};
过程是这样,其实就是变量赋值
var a;
consloe.log(a); //undefined
a(); //Error: a is not a function
a = function () {
console.log(a);
};
3.写到一块会怎样?
console.log("out " + a);
a();
function a() {
console.log(a);
a();
var a = 1;
a();
console.log(a);
function a() {
console.log("in " + a);
}
}
d打印结果是这样的

现在开始分析一下。。
console.log("out" a);不用解释,下面的function提到了最前面。
function中的顺序如下:
function a() {
var a; //变量提升
function a() { //函数提升 此时a便是函数
console.log("in " + a); // 打印出来也是函数
}
console.log(a);
a(); //函数执行
a = 1; //a变成了1 变量
a(); //变量不能执行 报错
console.log(a); //程序中断 此处没有执行
}
源程序var a 在 function 的上面,可能是先后顺序影响变量提升结果吗? 调整顺序:
console.log("out " + a);
a();
function a() {
console.log(a);
a();
function a() { //function a 放到 var a 之前,看会不会在上一句a()报错
console.log("in " + a);
}
var a = 1;
a();
console.log(a);
}
执行结果不变:

可以看出,是var永远先提前,之后function再提前。