javascript的函数arguments属性和callee调用递归

 arguments属性:      
        function fn1(){
            
          alert(arguments.length);            //可以写成这种形式
          alert(fn1.arguments.length);        //也可以写成这种形式,不能写成this.arguments
                                              //在此var fn1是一个函数,
                                              //js函数是个特殊的对象,
         for(var i=0;i<arguments.length;i++){ //与其他对象,有明显的区别,
                                              //可以理解成function标识着 fn1
                                              //这个对象继承了对象
           alert(arguments[i]);               //Function,为什么不能使用this.arguments呢,
                                              //因为函数在浏览器中直接使用
         }                                    //fn1()的方式调用等同于window.fn1(); 
                                              //在这里this指的是window对象
      }                    
        //arguments可以获得所有传递的参数,arguments倒底是不是对象呢,
        //在js中才真正是万物皆对象,所以arguments是
        //是Function对象的内在属性,但如果一旦调用,就可以形成一个独立的对象,
        //js中对象可以是属性,属性也可以是对象
        fn1(11,23,34); //结果为3
        
  Js递归问题:
        function fn1(arg){
            if(arg == 1){
                return 1;
            }
            return arg*fn1(arg-1);
        }
        
        var fn2 = fn1  //将fn1复制到fn2的空间里面一份
        alert(fn2(5))  //结果120
        fn1 = null;        //将断掉fn1以前指向的空间,空间没有被指向后回收
        alert(fn2(5))    //如果从函数的特殊性来说,fn2调用自己的空间匿名函数,不会出错,但由于
                        //递归的时候函数里面还有个自己调用自己,错误就出在这里
                        //此时出错,原因是fn2会调用自己空间里面的
                        //函数,可以吧fn2空间里面的函数看成没有函数名的匿名函数
                        //fn2--> function (arg){  
                        //            if(arg == 1){
                        //                return 1;                
                        //            }
                        //            return fn1(arg-1)*arg;  
                        //        }                                                
                        //在这个函数中仍然有指向fn1的地方,当fn1=null ,以后就会出错

解决:
        function fn1(arg){
            if(arg == 1){
                return 1;
            }
            return arg*arguments.callee(arg-1);  
            //此时就没有问题了,callee动态监测自己所在的函数的函数名,来调用
        }
        
        var fn2 = fn1  
        alert(fn2(5))  
        fn1 = null;        
        alert(fn2(5))    





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值