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调用递归
最新推荐文章于 2021-04-16 13:57:59 发布