第七章:函数表达式

//    递归函数
    function factorial(num) {
        if (num === 1) {
            return 1
        } else {
            return num * factorial(num - 1);
        }


    }
    console.log(factorial(99));
    /*arguments.callee  ====               表示函数本身 在递归时使用                                    */
    function fun() {
        console.log(arguments.callee)
    }
    fun()
    
    
    /*闭包==貌似啊好牛*的样子
         *   是指有权访问另一个函数作用域中的变量的函数
         *       创建闭包的常见方式是在一个函数内部创建另一个函数
         *   */
        function fn() {
            return function () {
                console.log(1)
            }
        }
        fn()();
    
        /*每个函数都有一个执行环境,这个执行环境都有一个表示变量的对象
         *   全局环境的变量对象始终存在*/
        function compare(a, b) {
            if (a > b) {
                return 1;
            } else if (a < b) {
                return -1;
            } else {
                return 0;
            }
    
        }
        /*当调用这个函数时会创建一个包含 arguments,a,b 的活动对象
        *       全局执行环境的变量对象在compare() 执行环境的作用域中处于第二位
        *       会创建一个预先包含全局变量对象的作用域链,这个作用被保存在内部的[[Scope]]属性中
        *
        *   函数执行时,会为函数创建一个执行环境
        *       */
    
        compare(1,2);
    
        /*一般而言当函数执行结束后,局部活动对象就会被销毁,内存中仅保存全局作用域(但是闭包的环境除外)*/
        
        
        /*this对象是在运行时基于函数的执行环境绑定的
            *  1 全局函数中this指向window
            *  2 而当函数作为某个对象的方法调用时this 就是那个对象
            *
            *   不过匿名函数的执行环境是具有全局性的 (因此this对象通常指向window)
            *
            *   每个函数被调用时都会自动取得两个特殊变量,
            *                       this
            *                       arguments
            * */
            var name='the window';
            var obj={
                name:'my obj',
                getName:function () {
                    return function () {
                        return this.name
                    }.bind(this);//加上bind(this)这里的this就是指这个对象了
                }
            };
            console.log(obj.getName()())
原文地址:https://www.cnblogs.com/aqigogogo/p/7639694.html