JavaScript的函数有两个特殊的对象属性,arguments 和 this。
arguments对象
该对象是一个类数组对象,包含了所有的传入函数的参数。如,定义了如下函数:
function fun(param1,param2) {
return param1 + param2;
}
不论为这个函数传入多少实参,js解释器都不会报错,因为实际上,ECMAScript 中的参数在内部是用一个数组来表示的。函数接收到的始终都是这个数组,而不关心数组中包含哪些参数(如果有参数的话)。在函数体内,可以通过arguments对象访问这个数组。如下:
function fun(param1,param2) {
console.log(arguments.length);
console.log(arguments);
}
fun(1,2);
运行上面的代码,会打印两条信息,第一条是数字2(参数的数组的长度为2),第二条信息是一个对象,如下:
可以看到:
(1)arguments对象有属性名为数字的属性,分别对应传入函数的参数,在函数内部可以通过arguments[0]这样的表达式获取到传入的参数值;
(2)还有一个length属性,用于表示传入函数的个数;
(3)还有一个callee属性,这个属性是一个指针,指向当前函数。可以利用这个属性,实现递归函数。如下面的阶乘函数:
function factorial(num) {
if (num <= 1){
return 1;
} else {
return num * arguments.callee(num-1);
}
}
写到这里,要插一句,递归函数最佳的实现是下面这样的,因为上面的写法在严格模式下会导致错误:
var factorial = function f(num) {
if (num <= 1){
return 1;
} else {
return num * f(num-1);
}
}
this对象
该对象指调用这个函数的对象。如下:
var obj = {
name:'Urie',
age:20,
fun:function(){
return this;
}
};
obj.fun();
运行上面的代码,返回的就是obj这个对象,如下: