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

2020-03-06  本文已影响0人  Fanny

函数也是对象,也有属于自己的属性
但是使用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();
        // })();
上一篇下一篇

猜你喜欢

热点阅读