在JavaScript中,每个函数内部可以使用arguments对象,该对象包含了函数被调用时的实际参数值。arguments对象虽然在功能上与数组有些类似,但它不是数组。arguments对象与数组的类似体现在它有一个length属性,同时实际参数的值可以通过操作符来获取,但arguments对象并没有数组可以使用的push、pop、splice等方法。其原因是arguments对象的prototype指向的是Object.prototype,而不是Array.prototype。
Java和C++语言都支持方法重载,即允许出现名称相同而形式参数不同的方法,但JavaScript并不支持这种方式的重载。这是因为JavaScript中的function对象也是以属性的形式出现的,在一个对象中增加与已有function同名的新function时,旧的function对象会被覆盖。不过可以通过使用arguments来模拟重载,其实现机制是通过判断arguments中实际参数的个数和类型来执行不同的逻辑。
function sayHello{
switch(arguments.length){
case 0:
return"Hello";
case 1:
return"Hello,"+arguments[0];
case 2:
return(arguments[1]=="cn"?"你好,":"Hello,")+arguments[0];
};
}
sayHello;//"Hello"
sayHello("Alex");//"Hello,Alex"
sayHello("Alex","cn");//"你好,Alex"
callee是arguments对象的一个属性,其值是当前正在执行的function对象。它的作用是使匿名function可以被递归调用。下面以一段计算斐波那契序列中第N个数的值的过程来演示arguments.callee的使用。
function fibonacci(num){
return(function(num){
if(typeof num!=="number")
return-1;
num=parseInt(num);
if(num<1)
return-1;
if(num==1||num==2)
return 1;
return arguments.callee(num-1)+arguments.callee(num-2);
})(num);
}
fibonacci(100);