美文网首页
JavaScript基础 解析顺序 案例

JavaScript基础 解析顺序 案例

作者: 0说 | 来源:发表于2018-01-28 23:44 被阅读0次
一、
<script type="text/javascript">
    /*
        函数的作用域,是看在哪里定义的,而不是在哪里执行的
    */
   var a = 10;
   x();
   function x(){
       var a = 20;
       y();
   }
   function y(){
       alert( a ); //这里弹的是全局的a  10;
   }
   /*
        y是全局函数 所有a应该找全局的a,跟执行没关系
    */
</script>

 <script>
            /*     结果:   function a(){  alert( 20 ); }      10      10    30     fucntion a(){ var  a = 20; alert( a ); }     20    fucntion a(){ var  a = 20; alert( a ); }
                解析:
                    全局作用域下
                        1、编译:
                                var a ;
                                function a(){
                                    alert( 20 );
                                }
                                var a ;
                                var a ;
                                函数优先级最高 编译结束 a就是函数
                         2、执行
                                alert( a )  弹出function a(){  alert( 20 ); }
                                a = 10;
                                alert( a )  弹出 10

                                function a(){
                                    alert( 20 );  函数定义 跳过
                                }

                                alert( a )  弹出 10
                                a = 30;
                                alert( a )  弹出  30
                                a = fucntion a(){
                                    var  a = 20;
                                    alert( a );
                                }
                                alert( a )  弹出   fucntion a(){ var  a = 20; alert( a ); }
                                a() ====>新的作用域
                                                    1、编译:
                                                            var a
                                                    2、执行:
                                                            a = 20
                                                            alert( a ) 弹出 20
                                alert( a )  弹出   fucntion a(){ var  a = 20; alert( a ); }

             */

            // 作业一
            alert( a );
            var a = 10;
            alert( a );
            function a(){
                alert( 20 );
            }
            alert( a );
            var a = 30;
            alert( a );
            var a = function a(){
                var a = 20;
                alert( a );
            }
            alert( a );
            a();
            alert( a );

            /*
            练习
                全局作用域
                    1、编译
                        var a ;
                        var b ;
                        function fn(){
                            var a = 20;
                            return function (){
                                a++;
                                alert( a );
                            }
                        }
                     2、执行
                         a = 10;
                         b = fn()   =====fn()执行 有函数执行要处理到最简结果
                                            新的作用域    结果是: b =  function (){  a++ ; alert( a );}
                                             1、编译:
                                                var a ;
                                             2、执行:
                                                a = 20;
                                                return function (){
                                                    a ++;
                                                    alert( a );
                                                }
                                               结束  返回的 function (){  a++ ; alert( a );} 给b


                        fn()()  代码从左往右执行 先执行
                                                    fn()新的作用域
                                                            1、编译:
                                                                 var a;
                                                            2、执行:
                                                                a = 20;
                                                                return function (){
                                                                    a++;
                                                                    alert( a );
                                                                }
                                                                fn()执行结束  返回值  function (){ a++;  alert( a ); }
                                                  再执行
                                                      fn()();
                                                            1、编译:
                                                                    没有
                                                            2、执行:
                                                                a++
                                                                alert( a )  弹出 21

                         b();   新的作用域      function (){  a++ ; alert( a );} 执行     定义变量先自己的作用域里找,如果没有向哪里定义的父级
                                                  1、编译:
                                                        没有
                                                 2、执行:
                                                         a++         a = 21
                                                         alert( a )  弹出 21
                         b()  新的作用域      function (){  a++ ; alert( a );} 执行
                                                 1、编译:
                                                     没有
                                                 2、执行:
                                                     a++      上面执行完  a = 21
                                                     alert( a )  弹出 22
                        fn()()  同上

            */
            var a = 10;
            var b = fn();
            fn()();
            b();
            b();
            fn()();
            function fn(){
                var a = 20;
                return function (){
                    a++;
                    alert( a );
                }
            }
            /*
             练习2
                全局作用域:
                        1、编译:
                            var a;
                            var b;
                            function fn(){
                                var a = 20;
                                return function (){
                                    a++;
                                    alert( a );
                                }
                            }
                        2、执行:
                            a = 10;
                            b = fn()   =====新的作用域            结果: b = function (){ a++ alert( a ) }
                                                        1、编译:
                                                               没有
                                                        2、执行:
                                                             a = 20  改变全局的a
                                                             return function (){ a++ alert( a ) }
                                                        fn()返回  function (){ a++ alert( a ) }


                            fn()()  代码从左往右执行 先执行
                                             fn()新的作用域
                                                         1、编译:
                                                             没有
                                                         2、执行:
                                                             a = 20;
                                                             return function (){
                                                                a++;
                                                                alert( a );
                                                             }
                                             fn()执行结束  返回值  function (){ a++;  alert( a ); }
                                      再执行
                                                fn()();
                                                     1、编译:
                                                        没有
                                                     2、执行:
                                                         a++      a=21
                                                         alert( a )  弹出 21


                          b();   新的作用域               function (){  a++ ; alert( a );} 执行     定义变量先自己的作用域里找,如果没有向哪里定义的父级
                                     1、编译:
                                            没有
                                     2、执行:
                                         a++         a = 22
                                         alert( a )  弹出 22


                         b()  新的作用域      function (){  a++ ; alert( a );} 执行
                                     1、编译:
                                         没有
                                     2、执行:
                                         a++      上面执行完  a = 23
                                         alert( a )  弹出 23


                        fn()()  同上    a=21


             */
            var a = 10;
            var b = fn();
            fn()();
            b();
            b();
            fn()();
            function fn(){
                a = 20;
                return function (){
                    a++;
                    alert( a );
                }
            }
        </script>

相关文章

网友评论

      本文标题:JavaScript基础 解析顺序 案例

      本文链接:https://www.haomeiwen.com/subject/pidtzxtx.html