标签:
一、callee
在学习callee之前,需要先学习arguments。
arguments:
[function.]arguments[n]
参数:function :当前正在执行的 Function 对象的名字。
n :要传递给 Function 对象的从0开始的参数值索引。
Arguments Objects 是函数上下文里的激活对象AO中的内部对象,它包括下列属性:
而其中第一个就是今天需要学习的一个属性。先看一个例子:
function add(a,b){ console.log(arguments.callee); return a+b; } add(3,4);
结果:
从结果可以看到,callee是一个指针,指向拥有这个arguments对象的函数。那么可以用这个属性可以做什么?再看一个例子:
function fac(num){ if(num <= 1){ //0的阶乘也是1 return 1; } else{ return num*fac(num-1); } } var trueFac = fac; fac = function(num){ return 0; }; console.log(trueFac(10));
结果:
结果并不是我们想要的,造成这个结果的原因就是在后边更改了fac,fac()永远返回0,而trueFac()方法中利用了fac()方法,造成了结果是0。解决这个问题就可以使用arguments.callee属性。
代码改为:
function fac(num){ if(num <= 1){ //0的阶乘也是1 return 1; } else{ return num*arguments.callee(num-1); } } var trueFac = fac; fac = function(num){ return 0; }; console.log(trueFac(10));
结果为:
arguments.callee指向arguments对象的拥有函数引用,当把fac的函数引用赋给trueFac后,arguments对象的拥有函数变成了trueFac,所以结果是正确的。
二、caller
caller与callee不同,caller属性并不属于arguments对象,它是函数对象的属性,Opera的早期版本不支持,这个属性保存着调用当前函数的函数的引用。
例子:
function outer(){ inner(); } function inner(){ console.log(inner.caller); } outer();
结果:
从结果可知,因为outer()调用了inner(),所以inner.caller就指向outer()。
Javascript arguments.callee和caller的区别
标签:
原文地址:http://www.cnblogs.com/niulina/p/5701404.html