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

原创 2013年12月05日 18:01:51
 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))    





相关文章推荐

【JS--基础--函数】--隐含参数对象arguments的callee 属性

callee: 返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文。   [function.]arguments.callee   可选项 function ...

javascript 函数 function arguments caller callee apply() call()

在JavaScript中,函数

arguments.callee 等js高手采用的属性

一、Arguments 该对象代表正在执行的函数和调用他的函数的参数。 [function.]arguments[n] 参数function :选项。当前正在执行的 Function 对象的名字...

javascript arguments(callee、caller)

arguments calle caller

理解JavaScript中的arguments,callee,caller,apply

arguments 该对象代表正在执行的函数和调用它的函数的参数。 [function.]arguments[n] 参数function :选项。当前正在执行的 Function 对象的名字。 ...

javascript的隐含参数(arguments,callee,caller)

原文链接:http://hahha2003.blog.163.com/blog/static/24857792009724111340807/   在提到上述的概念之前,首先想说说javascri...
  • aoyzc
  • aoyzc
  • 2012年05月22日 08:17
  • 278

JavaScript arguments、callee、caller

实验代码 function test(arg1) { console.log(arguments); console.log(typeof(arguments)); con...

JavaScript 之arguments、caller 和 callee 介绍

1.前言 arguments, caller ,   callee 是什么? 在javascript 中有什么样的作用?本篇会对于此做一些基本介绍。 2. argum...

JavaScript中的arguments,callee,caller,apply (转)

一、Arguments 该对象代表正在执行的函数和调用他的函数的参数。 [function.]arguments[n] 参数function :选项。当前正在执行的 Function 对象的名字...

JavaScript中的arguments,callee,caller,call,appy

/* * 演示arguments的用法,如何获取实参数和形数数 */ function argTest(a,b,c,d){ var numargs = arguments.length; ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:javascript的函数arguments属性和callee调用递归
举报原因:
原因补充:

(最多只允许输入30个字)