要想了解callee属性,我们先得了解javascript中的arguments对象,在《javascript高级程序设计》的第三章中,讲到了arguments对象,arguments对象有以下属性:
定义
属性名 | 定义 |
---|---|
length属性 | 返回实际传入的参数个数。 |
callee属性 | 返回当前函数的引用(匿名函数可以使用该属性实现递归调用)。 |
0…n属性 | 以顺序索引访问传入的具体参数。例如,使用arguments[0]可以访问传入的第1个参数,arguments[1]可以访问传入的第2个参数。 |
实例
接着我们再来看看《javascript高级程序设计》中的实例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script type="text/javascript">
function howarrays(){
document.write(arguments.length);
document.write("<br>");
}
howarrays("string",2);
howarrays("string");
howarrays(2);
howarrays();
</script>
</body>
</html>
返回结果如下:
2
1
1
0
在上述例子中可知: arguments.length可获知传递给函数的参数个数。
在此既然明白了arguments对象的用途,下面我们再来看看callee()属性。在《javascript高级程序设计》第五章中是这样描述callee()属性的:该属性是一个指针,指向拥有这个arguments对象的函数。其中还举出了例子(以计算10的阶乘为例):
方法一:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script type="text/javascript">
function factorial(num){
if(num<=1){
return 1;
}else{
return num*factorial(num-1);
}
}
document.write(factorial(10));
</script>
</body>
</html>
output: 3628800
方法二:
定义阶乘函数一般都得用到递归算法:如上面的代码所示,在函数有名字,而且名字以后不会变化的情况下,这样定义没有问题,但问题是这个函数的执行与函数名factorial紧紧的耦合在一起,为了消除这种紧密的耦合现象。arguments.callee就可以在此发挥它的作用了。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script type="text/javascript">
function factorical(num){
if(num<=1){
return 1;
}else{
return num*arguments.callee(num-1);
}
}
document.write(factorical(10));
</script>
</body>
</html>
output: 3628800