Javascript漂流记(上)__函数、递归、预编译

版权声明:本文为博主原创,转载请附上博文链接。 https://blog.csdn.net/AquamanTrident/article/details/90548550

一、函数(编程遵循高内聚,弱耦合)
    1、定义:
        函数声明:function test(){}
        函数表达式:命名款:var test = function abc(){},
                              匿名款:var test = function (){},起名也没用,干脆匿名吧。

    2、参数:形参,实参。有了它俩函数上天了...举个栗子

            function test(a,b){
                //var a,
                //    b;
                //test.length = 2;
                //console.log(arguments.length);2
                return a + b;
            }
            test(1,2);

        其中a,b为形参;1,2为实参。传递参数时,函数内部如下:
            隐式声明两个变量:a,b(函数有隐式属性test.length,表示形参长度)
            隐式arguments--[1,2]类数组,表示实参列表
            形参实参绑定,相互映射,a-->arguments[0];b-->arguments[1]
        JavaScript与Java不同,天生不定参。(好处大大的,例如Excel求和功能)

    3、return的两个作用
         终止函数
         返回值

二、递归

       话不多说,举个栗子,往明白了看。

              牢记两点:1、找规律;2、找出口

        //写一个函数,实现n的阶乘
        // n! = n * (n-1)!
        // 递归:
        //	1.找规律
        //	2.找出口
        //  只有一点好处,代码简洁,速度贼慢!!!
            function mul(n){
                if(n == 1 || n == 0){
                    return 1;
                }
                return n * mul(n-1);	
            }
            mul(5);
        // mul(5) ==> 5 * mul(4);5 * 24
        // mul(4) ==> 4 * mul(3);4 * 6
        // mul(3) ==> 3 * mul(2);3 * 2
        // mul(2) ==> 2 * mul(1);2 * 1

三、预编译(噩梦的开始)

    高潮掀起之前,先来点前戏。听听Javascript运行三步曲。
                 1、语法分析:通篇扫描
                 2、预编译:大闹天空
                 3、解释执行:解释一行执行一行

    都说英雄难过预编译关,到底怎么回事儿。老样子,高潮之前,还有前戏。

    预编译前奏:暗示全局变量(imply global),任何变量未经声明就赋值,归全局对象window所有。
                          一切声明的全局变量,都归window所有。

    辛辛苦苦声明的变量,咋就成window的了。别着急,往下看:

    敲黑板,敲黑板,重点来了!!!

    预编译发生在函数执行的前一刻,过程如下:
            1、创建GO(Global Object)/AO(Activation Object)对象(执行期上下文)
            2、找函数里的形参和变量声明,将形参名和变量声明的名儿作为AO对象的属性名,值为undefined
            3、将实参值和形参值相统一
            4、找函数体里的函数声明,值为函数体

   如下题:汇集了imply global、预编译为一体的身材苗条的鄙视题。

            a = 100;
            function demo(e){
                function e(){}
                arguments[0] = 2;
                console.log(e);//2
                if(a){
                    var b = 123;
                    function c(){}
                }
                var c;
                a = 10;
                var a;
                console.log(b);//undefined
                f = 123;
                console.log(c);//undefined
                console.log(a);//10
            }
            var a;
            demo(1);
            console.log(a);//100
            console.log(f);//123
            /*
            GO{
                a: undefined -> 100
                demo: function demo(){}
                f: 123
            }
            AO{
                e: undefined -> function e(){} -> 2
                b: undefined
                c: undefined,现在if内不允许声明函数
                a: undefined -> 10
            }
            */

以上内容属二哥原创,整理自 "渡一教育Javascript课程" ,一个值得推荐的"渡一教育"。
    

猜你喜欢

转载自blog.csdn.net/AquamanTrident/article/details/90548550