预解析

一、      预解析(在对应的作用域内执行)
             *     函数或者变量都会有一个提解析的过程,js会把函数或者变量提前解析一下,解析到它们对应的作用域最开始的僧
             * 步骤
             *  首先是在全局域下进行,
             *     1、先找var 、function关键字以及参数
             *     2、如果找到了var(声明的变量,参数),会给他赋一个undefined。如果找到了function,那它会把整个函数都拿过来
             *             如果没有找到var那么就相当于结束了
             *     3、把找到的东西,放到对应的作用域的最开始的位置
             *     4、逐行执行代码

             *  如果到了函数域(一个新的域里面),又会在函数域重新进行1.2.3.4

            //var a=undefined;
            
            /*var b=undefined;
            function fn(){
                console.log(b);    //undefined
                var b=20;
            }*/
            console.log(a);        //undefined
            var a=10;
            console.log(a);        //10
            
            var b=12;
            function fn(){
                //var b=undefined;因为在函数域里面又重新开始找var并且找到了赋了一个undefined.
                console.log(b);    //undefined
                var b=20;
            }
            fn();
            
            var b=12;
            function fn(){
                //因为在这里的函数域没有var,所以就没有重新赋予一个undefinded,
                //直接的就用了上一个域里面的var b=12
                console.log(b);    //undefined
            }
            fn();
二、函数预解析
            /*function fn1(){
                console.log('fn1');
            }
            var fn2=undefined;
            function(){
                console.log('fn2');
            }*/
            
            /*
             * 函数
             *     1、函数声明
             *         函数声明可以被预解析,所以可以先调用,再声明
             *     2、函数表达式
             *         函数表达式,不会被预解析,所以只能先声明再调用,不能把调用放在声明的前面(不然就报错)
             */
            
            fn1();    //在这里fn1是可以调用
            function fn1(){
                console.log('fn1');
            }
            //fn1();
            
            
            //fn2();        //报错
            var fn2=function(){
                console.log('fn2');
            }
            fn2();    //fn2
posted @ 2017-02-05 09:40  CafeMing  阅读(248)  评论(0编辑  收藏  举报