caller和callee的区别
答案:2 悬赏:40
解决时间 2021-11-09 14:46
- 提问者网友:痞子房西
- 2021-11-09 06:59
caller和callee的区别
最佳答案
- 二级知识专家网友:你好陌生人
- 2021-11-09 07:30
callee
callee是对象的一个属性,该属性是一个指针,指向参数arguments对象的函数
首先我们来写个阶成函数:
function chen(x){
if (x<=1) {
return 1;
} else{
return x*chen(x-1);
};
};
从这个函数中可以看出来,用到了递归函数,要是改变了函数名,里面的函数名也要随着改变,这样很不方便所以我们用callee来试试
function chen(x){
if (x<=1) {return 1;
}else{
return x*arguments.callee(x-1);
};
};
我们来分析一下为什么这样写:根据callee的定义,可以看出来callee是arguments对象的一个属性,指向arguments对象的函数,这个函数就是chen(chen=arguments.callee),这样解释应该可以理解了吧。
caller
caller是函数对象的一个属性,该属性保存着调用当前函数的函数的引用(指向当前函数的直接父函数)
先来个例子吧
function a(){
b();
};
function b(){
alert(b.caller);
};
a(); //结果就是弹出函数a和内容
我们来解释一下吧,首先函数b的属性caller调用当前函数b的函数引用a(就是指向当前函数b的父函数a),所以结果就是弹出 function a(){ b();};
那么了解了caller和callee,那么可以不可以将二者结合在一起来使用呢
function b(){
alert(b.caller);
};
从这个代码可以看出b函数中调用了b函数名,这样当函数名改变时就很不方便,我们需要替换里面的那个b
前面我们知道用什么方法可以指向当前对象,下面我们就来修改一下:
(function a(){
b();
})();
function b(){
alert(arguments.callee.caller);
};
从代码中可以看出我们用arguments.callee代替了b函数
callee是对象的一个属性,该属性是一个指针,指向参数arguments对象的函数
首先我们来写个阶成函数:
function chen(x){
if (x<=1) {
return 1;
} else{
return x*chen(x-1);
};
};
从这个函数中可以看出来,用到了递归函数,要是改变了函数名,里面的函数名也要随着改变,这样很不方便所以我们用callee来试试
function chen(x){
if (x<=1) {return 1;
}else{
return x*arguments.callee(x-1);
};
};
我们来分析一下为什么这样写:根据callee的定义,可以看出来callee是arguments对象的一个属性,指向arguments对象的函数,这个函数就是chen(chen=arguments.callee),这样解释应该可以理解了吧。
caller
caller是函数对象的一个属性,该属性保存着调用当前函数的函数的引用(指向当前函数的直接父函数)
先来个例子吧
function a(){
b();
};
function b(){
alert(b.caller);
};
a(); //结果就是弹出函数a和内容
我们来解释一下吧,首先函数b的属性caller调用当前函数b的函数引用a(就是指向当前函数b的父函数a),所以结果就是弹出 function a(){ b();};
那么了解了caller和callee,那么可以不可以将二者结合在一起来使用呢
function b(){
alert(b.caller);
};
从这个代码可以看出b函数中调用了b函数名,这样当函数名改变时就很不方便,我们需要替换里面的那个b
前面我们知道用什么方法可以指向当前对象,下面我们就来修改一下:
(function a(){
b();
})();
function b(){
alert(arguments.callee.caller);
};
从代码中可以看出我们用arguments.callee代替了b函数
全部回答
- 1楼网友:没感情的陌生人
- 2021-11-09 08:09
caller
caller返回一个函数的引用,这个函数调用了当前的函数。
使用这个属性要注意:
1 这个属性只有当函数在执行时才有用
2 如果在javascript程序中,函数是由顶层调用的,则返回null
functionname.caller: functionname是当前正在执行的函数。
var a = function() {
alert(a.caller);
}
var b = function() {
a();
}
b();
上面的代码中,b调用了a,那么a.caller返回的是b的引用,结果如下:
[javascript] view plain copy
var b = function() {
a();
}
如果直接调用a(即a在任何函数中被调用,也就是顶层调用),返回null:
[javascript] view plain copy
var a = function() {
alert(a.caller);
}
var b = function() {
a();
}
//b();
a();
输出结果:
null
------------------------------------------------------------------
callee
callee放回正在执行的函数本身的引用,它是arguments的一个属性
使用callee时要注意:
1 这个属性只有在函数执行时才有效
2 它有一个length属性,可以用来获得形参的个数,因此可以用来比较形参和实参个数是否一致,即比较arguments.length是否等于arguments.callee.length
3 它可以用来递归匿名函数。
[javascript] view plain copy
var a = function() {
alert(arguments.callee);
}
var b = function() {
a();
}
b();
a在b中被调用,但是它返回了a本身的引用,结果如下:
[javascript] view plain copy
var a = function() {
alert(arguments.callee);
}
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯
• 手机登qq时,显示手机磁盘不足,清理后重新登 |
• 刺客的套装怎么选啊? |