您的位置:首页 > Web前端 > JavaScript

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))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: