参数包括两种 ,形参和实参。形参就是函数声明的参数变量,仅在函数体内可见,实参是实际传递的值。
有时候,当没有给定参数时,让函数给参数指定一个默认的值是很有用的。
arguments 对象表示函数的实参集合,它是一个伪数组,拥有与数组类似的结构,可以通过数组的下标的形式访问函数实参值。仅能够在函数体内可见,并直接访问。
arguments 是一个伪数组,不能够继承 Array 的原型方法。可以使用数组的下标进行访问每一个实参,如 arguments[1] 表示第二个参数。之中, length 是 arguments 的属性。表示函数包含的实参个数。同时, arguments 对象可以允许更新其包含的实参数。
可通过修改 arguments 对象的 length 属性值,也可以达到改变实参个数的目的。当 length 属性值增大时,则增多的实参值为 undefined 。
callee 是 arguments 对象的属性,它引用当前的 arguments 对象所在的函数。使用该属性可以在函数体内调用自身。在匿名函数内 callee 比较有用,例如,利用它可以设计递归调用。
function f(x, y, z) {
var a = arguments.length;
//获取函数实参的个数
var b = arguments.callee.length; //获取函数形参的个数
if (a != b) {
//如果形参与实参不相等,则提示错误
throw new Error('传递的参数不匹配 ');
} else {
return x + y + z;
//如果实参和形参数目相同,则返回它们的和
}
}
console.log(f(3, 4, 5));
arguments.callee 相当于函数名。
argument 对象不是数组,他有一个 length 属性,可以通过 [] 来获取实参值,但是 argument 没有数组的 pop 、 push 、 shift 、 unshift 、 splice 等方法。其原因是 arguments 对象的 prototype 指向 Object.prototype ,而不是 Array.prototype 。
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);
}
alert(fibonacci(100));