javascript中caller和callee的用法。
看下作用:
functionName.caller 获取调用当前函数的函数
arguments.callee 返回正在被执行的function对象,即指定对象的原文
先说callee,因为用的地方可能多一些。
废话不说了,直接上代码
functionName.caller 获取调用当前函数的函数
arguments.callee 返回正在被执行的function对象,即指定对象的原文
先说callee,因为用的地方可能多一些。
废话不说了,直接上代码
```
function a(x){
if(x<=1)
return x;
else
return x + a(x-1);
}
a(12) // 78
if(x<=1)
return x;
else
return x + a(x-1);
}
a(12) // 78
// 这是一个极简的递归,运行结果正常。
// 再看看下面的调用方法
// 再看看下面的调用方法
var b = a;
a = null; // 将a回收
b(12); // erro : 'a' is not a function
a = null; // 将a回收
b(12); // erro : 'a' is not a function
```
原因也简单,b=a,b=function a(){};在b调用之前,我们用了a=null。所以在 function a 运行的时候,其中的return x + a(x-1);中的a,指向的就是null,而不是 function a。
所以就报错了,如何解决这样的问题。我们将a换一种写法
原因也简单,b=a,b=function a(){};在b调用之前,我们用了a=null。所以在 function a 运行的时候,其中的return x + a(x-1);中的a,指向的就是null,而不是 function a。
所以就报错了,如何解决这样的问题。我们将a换一种写法
```
function a(x){
if(x<=1)
return x;
else
return arguments.callee(x-1); // 这句是改变的地方
}
function a(x){
if(x<=1)
return x;
else
return arguments.callee(x-1); // 这句是改变的地方
}
// 再调用
var b = a;
a = null;
b(12); // 78
var b = a;
a = null;
b(12); // 78
```
原因:虽然我们将a=null了,但是函数a中并没有用到a,而是通过arguments.callee指向当前函数。
因为arguments.callee的定义就是:返回正在执行的函数。
====================
再看 functionName.caller
caller指向调用当前函数的函数,但是有一点,如果是在全局作用域内(即顶层window)被调用,则返回null。
代码走起
原因:虽然我们将a=null了,但是函数a中并没有用到a,而是通过arguments.callee指向当前函数。
因为arguments.callee的定义就是:返回正在执行的函数。
====================
再看 functionName.caller
caller指向调用当前函数的函数,但是有一点,如果是在全局作用域内(即顶层window)被调用,则返回null。
代码走起
```
function testCaller(){
if(testCaller.caller == null){
console.log('accessed at global');
}else{
console.log('accessed at ' + testCaller.caller);
}
}
// 在全局调用
testCaller(); // accessed at global
// 在一个函数中调用
function a(){
testCaller();
}
a(); // accessed at function a(){testCaller();} 此时,testCaller.caller指向就是 function a
```
说完
参考资料
http://msdn.microsoft.com/zh-cn/library/334e1zza(v=vs.94).aspx
http://msdn.microsoft.com/zh-cn/library/7t96kt3h(v=vs.94).aspx
https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Global_Objects/Function/caller
function testCaller(){
if(testCaller.caller == null){
console.log('accessed at global');
}else{
console.log('accessed at ' + testCaller.caller);
}
}
// 在全局调用
testCaller(); // accessed at global
// 在一个函数中调用
function a(){
testCaller();
}
a(); // accessed at function a(){testCaller();} 此时,testCaller.caller指向就是 function a
```
说完
参考资料
http://msdn.microsoft.com/zh-cn/library/334e1zza(v=vs.94).aspx
http://msdn.microsoft.com/zh-cn/library/7t96kt3h(v=vs.94).aspx
https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Global_Objects/Function/caller