1、callee:
callee是对象的一个属性,该属性是一个指针,指向参数arguments对象的函数。
作用:指向当前对象。
例1:
<script type="text/javascript">
function myExample(a){
if (a<=1) {
return 1;
}else{
return a*myExample(a-1);
};
};
alert(myExample(3));
</script>
例2:
<script type="text/javascript">
function myExample(a){
if (a<=1) {
return 1;
}else{
return a*arguments.callee(a-1);
};
};
alert(myExample(3));
</script>
上面的两端代码执行后的结果如下图:
总结:arguments.callee指向的其实就是myExample这个函数,也就是说
a*myExample(a-1) == a*arguments.callee(a-1)
,arguments是一个对象,callee就是arguments这个对象的属性,这个属性是一个指针,它指向的就是参数arguments对象的函数。
2、caller:
caller是函数对象的一个属性,它保存着调用当前函数的直接父函数,返回的是一个函数,返回的这个函数调用了当前函数。
例如:
<script type="text/javascript">
function fatherFunc(){
childFunc();
}
function childFunc(){
alert(childFunc.caller);
}
fatherFunc();
</script>
运行上面的代码的到如下图的结果:
由上图可以看出来返回的是父级函数 fatherFunc()。
总结:caller是一个函数对象的属性,在上面实例中caller就是函数childFunc的属性,当前函数就是childFunc(),fatherFunc()调用的就是childFunc(),而caller储存的就是调用当前函数的直接父函数,也就是caller储存的其实就是实例中的fatherFunc()函数。
3、将callee与caller结合使用:
我们知道其实每一个函数都存在一个伪数组,即参数arguments对象,在上面我们讲过,callee是一个指针,指向的就是当前函数也就是参数arguments对象的函数,那么我们就可以试图将callee与caller这两个属性结合来使用,如下实例:
例如:
<script type="text/javascript">
function fatherFunc(){
childFunc();
}
function childFunc(){
alert(childFunc.caller);
}
fatherFunc();
</script>
上面的这个代码片段中
childFunc.caller 我们可以改写为
arguments.callee.caller 因为任何一个函数都拥有arguments这个参数,而arguments.callee又是指向当前的这个函数也就是childFunc()这个函数,所以
childFunc.caller === arguments.callee.caller。
运行上面的代码得到结果如下图所示:
补充:什么是伪数组?以及伪数组都有哪?
伪数组:
定义:无法直接调用数组方法或期望length属性有什么特殊的行为,但仍可以对真正数组遍历方法来遍历它们。
对于定义,我的理解是这样,简单的说就是,其实伪数组它不是一个真正的数组,对于很多可以在真正数组中可以使用的函数方法,在这个伪数组中是无法使用的,但是有一点我们可以使用,那就是对数组的遍历,因为伪数组中也存在length这个方法。
那么伪数组都有哪些呢?
如:
1、函数的参数arguments对象
2、调用document.getElementsByTagName()方法获得的一组标签名称集。
3、调用document.childNodes()方法获得的子节点集合。
如有理解不当之处,欢迎各位老铁留言指正。谢谢!!!!