关闭

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

378人阅读 评论(0) 收藏 举报
分类:
 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
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:5121次
    • 积分:125
    • 等级:
    • 排名:千里之外
    • 原创:9篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档