永发信息网

Javascript arguments.callee和caller的区别

答案:2  悬赏:20  手机版
解决时间 2021-03-10 12:18
Javascript arguments.callee和caller的区别
最佳答案
一、callee
  在学习callee之前,需要先学习arguments。
  arguments:
含义:该对象代表正在执行的函数和调用它的函数的参数。
语法:[function.]arguments[n]
参数:function :当前正在执行的 Function 对象的名字。
       n :要传递给 Function 对象的从0开始的参数值索引。   
说明:在前面执行上下文的学习过程中,知道生成执行上下文需要两个阶段,分别是进入执行上下文和执行阶段。在其中的进入执行上下文阶段中,需要做三个工作,其中一个工作是创建幷初始化AO,即arguments对象。
Arguments Objects 是函数上下文里的激活对象AO中的内部对象,它包括下列属性:
callee:指向当前函数的引用
length: 真正传递的参数的个数
properties-indexes:就是函数的参数值(按参数列表从左到右排列)
  而其中第一个就是今天需要学习的一个属性。先看一个例子:
function add(a,b){
    console.log(arguments.callee);
    return a+b;
}
add(3,4);
  结果:
  function add(a,b){
        console.log(arguments.callee);
        return a+b;
    }
    NaN
  从结果可以看到,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));
  结果:0
  结果并不是我们想要的,造成这个结果的原因就是在后边更改了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));
  结果为:3628800
  arguments.callee指向arguments对象的拥有函数引用,当把fac的函数引用赋给trueFac后,arguments对象的拥有函数变成了trueFac,所以结果是正确的。
二、caller
  caller与callee不同,caller属性并不属于arguments对象,它是函数对象的属性,Opera的早期版本不支持,这个属性保存着调用当前函数的函数的引用。
  例子:
function outer(){
    inner();
}
function inner(){
    console.log(inner.caller);
}
outer();
  结果:
    function outer(){
    inner();
    }
  从结果可知,因为outer()调用了inner(),所以inner.caller就指向outer()。
全部回答
arguments.length 是实参长度 arguments.callee.length 是形参长度 这里有个简单的例子,是比较参数的长度的: function test(x,y,z) { checkargu(arguments); return x+y+z; } function checkargu(argu) { var argu_test1, argu_test2; argu_test1 = argu.length; argu_test2 = argu.callee.length; if(argu_test1 == argu_test2) alert("yes"); else alert("no"); } test(1,2,3); test(1,2,3,4);
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
小时代4的长镜头在哪里
沈北亚泰城五证齐全吗
____a young woman, the office was empty. (
b=0是直线y=kx+b过原点的充要条件,请问是怎么
排课系统的c++课程设计
海藻果冻我想知道这个在什么地方
皮肤被太阳晒了出现红斑是怎么回事
鼎字用音序查字法怎么查
柴油机活塞环走位是什么原因
【有所期诺 纤毫必偿 有所期约 时刻不易的意
黄铎堡镇陈庄小学地址在哪,我要去那里办事
AKON的 so special 中文歌词
4200元能买什么配置电脑,主要处理器和显卡
胡创建他是一个脾气不好心底很好的人。爱帮助
牛奶是否含钙高?
推荐资讯
移动联通基站噪音大向法院起诉有胜诉的吗
maybe与may beHe
钢梁和钢筋的焊接取5d和10d是什么意思
有乳腺纤维瘤能喝大麦若叶青汁吗?桂圆干跟枸
从税务代理执业人员方面分析,注册税务师产生
王莽新朝,蜀汉,南唐,南宋,哪个朝代先出现
(x^4-6x²+9)y平方 怎么解开,用什么方
网金社的注册流程
2题怎么写?1和3题对吗?
九莲山茶叶减肥专卖在哪里啊,我有事要去这个
响尾蛇导弹是现代战争中应用很广泛的一种武器
(x+1)的零次方中x为什么不为负1
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?