JS变量提升函数提升

236 阅读1分钟

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再提前。