美文网首页
函数对象常用的属性 和 call与caller与callee的区

函数对象常用的属性 和 call与caller与callee的区

作者: Fanny | 来源:发表于2020-03-06 10:12 被阅读0次

    函数也是对象,也有属于自己的属性
    但是使用console.log(fn) 打印的是函数体代码,要想获取函数对象自己的属性需要使用console.dir(fn)

    //函数也是对象,也会有自己默认成员
            function fn(){};
    
            console.dir(fn);
    
    
            /* 
            call与caller与callee的区别
    
            call : 属于 Function.prototype. 作用是修改函数中的this指向
            caller : 属于 函数对象的成员.    作用是获取调用这个函数的引用(我被谁调用了)
            callee: 属于 arguments对象的,  作用是获取函数本身    (匿名函数递归调用)
            
             */
    
            //1.caller: 获取调用这个函数的引用(我被谁调用了)
            /* 
            a.  如果在函数B中调用函数A,那么函数A的caller就是函数B
            b.  如果是全局调用(window来调用),那么函数的caller就是null
             */
            function fn1(){
                console.log('哈哈');
                console.log(fn1.caller);//fn2
                
            };
    
            function fn2(){
                fn1();
                console.log('嘿嘿');
                
            };
    
            fn2();
    
            fn1();//window.fn1()
    
            //2.length: 获取形参的个数
    
            function fn3(a,b,c,d){
                console.log(fn3.length);//4
            };
    
            console.log(fn3.length);//4
    
            fn3(10,20,30);
    
            //3.name : 获取函数名字
    
            function fn4(){
                console.log(fn4.name);//fn4
            };
    
            console.log(fn4.name);//fn4
            fn4();
    
        
            //4.arguments : 获取所有的实参
            function fn5(num){
                //arguments:伪数组,本质是对象
                // console.log(fn5.arguments);//函数对象的一个属性 arguments
                // console.log(arguments);//js基础学习的arguments关键字
                
                /*arguments是一个对象,也有自己的属性
                    callee: 获取函数自身 (匿名函数递归调用)
                    length: 获取实参的个数 
                 */
                //  console.log(fn5.arguments.length);
    
                //  console.log(fn5.arguments.callee);//fn5
    
    
                 //函数对象的arguments属性 和  arguments关键字 是同一个对象吗?  不是同一个
    
                /* 
                1. arguments关键字最常用
                2. arguments属于函数中的关键字, 函数名.arguments属于函数对象的属性
                    arguments关键字作用:获取函数所有的实参。与形参一一对应
                    函数名.arguments : 只能获取实参。 不与形参一一对应
                 */
                // console.log(arguments === fn5.arguments);//false
    
                /* 使用最多最牛逼的arguments关键字
                
                 */
                 console.log(num);//10
                 //修改形参:arguments也会改
                 num = 100;
                 console.log(arguments); // Arguments(5)
                                         // 0: 100
                                         // 1: 20
                                         // 2: 30
                                         // 3: 40
                                         // 4: 50
                                         // callee: ƒ fn5(num)
                                         // length: 5
                                         // Symbol(Symbol.iterator): ƒ values()
                                         // __proto__: Object
                  
                 //修改arguments,形参也会改
                 arguments[0] = 500;
                 console.log(arguments);// Arguments(5)
                                         // 0: 500
                                         // 1: 20
                                         // 2: 30
                                         // 3: 40
                                         // 4: 50
                                         // callee: ƒ fn5(num)
                                         // length: 5
                                         // Symbol(Symbol.iterator): ƒ values()
                                         // __proto__: Object
                 console.log(num);
                 console.log(fn5.arguments);
            };
    
            fn5(10,20,30,40,50);
    
            //递归函数:自己调用自己
    
            // (function(){
            //     console.log(111);
            //     //如果想在匿名函数中调用自身
            //     arguments.callee();
            // })();
    

    相关文章

      网友评论

          本文标题:函数对象常用的属性 和 call与caller与callee的区

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