Javascript arguments.callee和caller的区别

一、callee

  在学习callee之前,需要先学习arguments。

  arguments:

  • 含义:该对象代表正在执行的函数和调用它的函数的参数。
  • 语法:

1

[function.]arguments[n]

  参数:function :当前正在执行的 Function 对象的名字。

       n :要传递给 Function 对象的从0开始的参数值索引。   

  • 说明:在前面执行上下文的学习过程中,知道生成执行上下文需要两个阶段,分别是进入执行上下文和执行阶段。在其中的进入执行上下文阶段中,需要做三个工作,其中一个工作是创建幷初始化AO,即arguments对象。
  • Arguments Objects 是函数上下文里的激活对象AO中的内部对象,它包括下列属性:

    1. callee:指向当前函数的引用
    2. length: 真正传递的参数的个数
    3. properties-indexes:就是函数的参数值(按参数列表从左到右排列)

  而其中第一个就是今天需要学习的一个属性。先看一个例子:

1

2

3

4

5

function add(a,b){

    console.log(arguments.callee);

    return a+b;

}

add(3,4);

  结果:

  

  从结果可以看到,callee是一个指针,指向拥有这个arguments对象的函数。那么可以用这个属性可以做什么?再看一个例子:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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属性。

  代码改为:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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的早期版本不支持,这个属性保存着调用当前函数的函数的引用。

  例子:

1

2

3

4

5

6

7

function outer(){

    inner();

}

function inner(){

    console.log(inner.caller);

}

outer();

  结果:

 

  从结果可知,因为outer()调用了inner(),所以inner.caller就指向outer()。

callee与caller的区别相关推荐

  1. [js] callee和caller的区别和作用是什么?

    [js] callee和caller的区别和作用是什么? arguments.callee 指的是当前函数 Function.caller 指的是调用当前函数的函数 举个例子:function a() ...

  2. java caller_JavaScript中callee和caller的区别与用法实例分析

    本文实例讲述了JavaScript中callee和caller的区别与用法.分享给大家供大家参考,具体如下: 1.callee 在函数的内部,有两个特殊的对象:arguments和this.其中arg ...

  3. arguments.callee和caller的区别

    arguments.callee和caller的区别 1.arguments arguments 是一个对应于传递给函数的参数的类数组对象. 白话就是这是一个函数的传参的集合,不是数组,但是是一个类数 ...

  4. 函数的callee和caller的区别和用处

    1. callee \ arguements.callee 是什么? 就是一个指针 可以指向函数本身 1.每个函数都存在一个arguements的对象 尔callee存在于arguements cal ...

  5. callee和caller的区别和用法

    先来一个通俗易懂的简单描述: 简单一点来说caller是指向调用当前函数的函数,比如b函数调用a函数,那么a.caller则是b的引用:callee是arguments的一个属性,指向其函数自身,比如 ...

  6. callee、caller、call、apply、bind这些方法的含义和使用

    在学校时间比较充裕,所以利用这段时间好好回顾下了js的基础.这回说下这五个函数属性方法,它们分别是:callee.caller.call.apply.bind 这5个方法在刚学js的时候一直理解不透, ...

  7. js函数的内部属性---arguments,callee,caller

    在接下来的几篇文章中,我大家谈谈函数的内部属性,arguments,callee,caller (1)arguments,是一个类数组对象,其中包含了传入函数的所有参数,主要用途是,保存函数的参数: ...

  8. ES5-13 对象属性遍历、this、callee、caller

    链式调用 在每个函数内部return this 访问对象属性 点语法 []中括号内是字符串或是变量 数组是特殊的对象 对象属性遍历 for in(遍历对象或数组) - 不必再用Object.keys那 ...

  9. JavaScript中callee和caller的用法解读

    1.callee: callee是对象的一个属性,该属性是一个指针,指向参数arguments对象的函数. 作用:指向当前对象. 例1: <script type="text/java ...

最新文章

  1. FIA2020会议准备相关工作
  2. bigdecimal正确用法_BigDecimal用法详解
  3. 学python要多少钱-学习Python这门课程大概需要多久?费用是多少?
  4. 我的2012年度总结
  5. python3 long类型_Python3 基本数据类型
  6. 表的插入、更新、删除、合并操作_10_仅复制表结构
  7. 音视频技术开发周刊 69期
  8. LeetCode动态规划 环形子数组的最大和
  9. JavaScript输入输出
  10. quartz中定时表达式详解
  11. GET请求与POST请求的区别
  12. 自定义xadmin后台首页
  13. [转]对比Cassandra、 Mongodb、CouchDB、Redis、Riak、 Membase、Neo4j、HBase
  14. 手机上有哪些不错的c语言编程软件?
  15. Kibana:Drilldown 中的 URL 模板
  16. COMSOL电化学专题培训通知
  17. linux切换桌面的快捷键,SUSE Linux Gnome桌面快捷键整理
  18. 【JS教程】移动端 Touch(触摸)事件
  19. 怎么用计算机弹出光年之外,明日之后光年之外简谱代码-明日之后光年之外怎么弹-明日之后光年之外钢琴曲谱分享_牛游戏网...
  20. 如何使用word模板生成word文档(文本,图片)

热门文章

  1. 关于解决乱码问题的几个步骤
  2. NRF52832 SPI 资料收集
  3. Surface Laptop2 键盘无响应,只有电源键有效(已解决)
  4. Flask 视图的高级技术
  5. Word不计算封面、目录页数将正文页码修改为第几页共几页的格式
  6. Android组件化跨进程通信框架Andromeda解析
  7. 【优化】利普希茨连续(Lipschitz continuous)及其应用
  8. 新学习的语言Groovy
  9. POJ 3373 模运算 + 折半枚举
  10. 每个程序猿都有个黑客小宇宙,自敲代码的时候就爆发了一发不可收拾