javascript的函数arguments属性和callee调用递归
2013-12-05 18:01
507 查看
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))
相关文章推荐
- JavaScript函数之实际参数对象(arguments) / callee属性 / caller属性 / 递归调用 / 获取函数名称的方法
- javascript的递归调用 特殊指针arguments.callee
- JavaScript——递归调用使用arguments.callee
- JavaScript Arguments 实现可变参数的函数,以及函数的递归调用
- javascript 的函数调用过程中的arguments,callee,caller,apply,call
- [Javascript] arguments.callee.caller(如何知道到函数被谁调用了)
- 函数内部arguments的callee属性
- 页面自动跳转与函数递归以及(arguments.callee)
- 【JS--基础--函数】--隐含参数对象arguments的callee 属性
- JavaScript 函数的不常用属性(name/callee/caller)
- javascript中用函数属性实现函数调用计数
- arguments 属性(函数)(JavaScript)
- Javascript 函数中的arguments.callee
- JavaScript 在对象中声明的函数的递归调用
- JavaScript创建一个add()函数可实现,可变参数和递归调用
- javascript 中 arguments.callee属性
- 函数内部属性[arguments.callee]
- js函数的内部属性---arguments,callee,caller
- js 函数内部属性arguments.callee
- javascript的递归、尾调用和蹦床函数: 各种解决方案的性能对比及Babel和ES6优化([翻译自外网博客]