一、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()。

Javascript arguments.callee和caller的区别的更多相关文章

  1. JavaScript函数之实际参数对象(arguments) / callee属性 / caller属性 / 递归调用 / 获取函数名称的方法

    函数的作用域:调用对象 JavaScript中函数的主体是在局部作用域中执行的,该作用域不同于全局作用域.这个新的作用域是通过将调用对象添加到作用域链的头部而创建的(没怎么理解这句话,有理解的亲可以留 ...

  2. JavaScript中的callee与caller的区别

    1.callee callee是对象的一个属性,该属性是一个指针,指向参数arguments对象的函数 作用:就是用来指向当前对象 返回正被执行的 Function 对象,也就是所指定的 Functi ...

  3. JavaScript中callee与caller,apply与call解析

    1. arguments.callee 1.1 解释 返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文. 1,.2 说明 callee 属性的初始值就是正被执行的 ...

  4. 引用类型--Function类型(函数声明与函数表达式、arguments.callee、caller、apply、call、bind)

    在ECMAScript中函数实际上是对象.每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定 ...

  5. js中的bind、apply、call、callee、caller的区别

    1.bind.apply与call的区别与使用 相同点:2者是函数原型的一个方法,因此调用者都必须是函数,第1个参数都是对象.作用是,用另一个对象替换当前对象,另一对象也即是你传的第一个参数.通常用于 ...

  6. js中callee与caller的区别

    callee是对象的一个属性,该属性是一个指针,指向参数arguments对象的函数首先我们来写个阶成函数:function chen(x){if (x<=1) {return 1;} else ...

  7. arguments.callee 和 caller

    arguments arguments它是一个类数组对象,包含着传入函数中的所有参数.虽然 arguments 的主要用途是保存函数参数, 但这个对象还有一个名叫 callee 的属性,该属性是一个指 ...

  8. JavaScript Arguments.callee解释

    Arguments.callee : 返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文.[function.]arguments.callee可选项 functio ...

  9. 关于arguments.callee.caller.arguments[0]获得event的一些问题

    先从一个简单的例子说起,一个简单的button控件如下: < input  type ='button'  name ='mybtn'  id ='mybtn'  onclick ='myFun ...

随机推荐

  1. app原生和H5混合使用自动化

    1.从原生切换到H5需要 driver.switch_to.context('WEBVIEW_com.tencent.mm:tools') 2.参考连接: https://testerhome.com ...

  2. OllyDbg使用笔记

    [TOC] OD步过后,返回到之前某位置,重新单步执行 找到你想返回的行, 右键选择New origin here,快捷键Ctrl+Gray *, 然后程序会返回到这一行,再次按F7或者F8等执行即可

  3. 【Codeforces 1000F】One Occurrence

    题意:给一个序列,每次查询某个区间内一个只出现一次的数. 思路:线段树. 首先我们看只出现一次的本质是什么. 如果一个数\(x​\)在\((l,r)​\)中只出现了一次,那么它在其中第一次出现位置为\ ...

  4. C# 使用微软自带的Speech进行语音输出

    1.在VS中使用微软自带的Speech进行语音播报,首先需要添加引用: 2.具体实现逻辑代码如下:

  5. 互怼、IPO、雷潮、寒冬,2018 互联网圈的那些事儿

    有了人的地方,就会有江湖. 有江湖的地方,就会有门派. 有门派的地方,就会有纷争. 有纷争的地方,就会有兴衰. 2018年马上就要离我们远去了,迎接我们的将会是新的一年——2019年.在整个过去的20 ...

  6. HDU-1695 莫比乌斯反演

    这里学习一下莫比乌斯反演 翻看了很多书,发现莫比乌斯反演,准确来说不是一种固有的公式,而是一种法则. 我们定义F(n),为f(d)的和函数,而定义f(n)为某儿算术函数. 反演公式1:反演n的因子时 ...

  7. 播放器更改语言归属地后Cnario player软件无法启动的问题

    打开系统运行,输入regedit,进入注册表编辑器. 找到HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\C-nario\Player下面culture 的值,删除即可 ...

  8. Node之安装篇

    本篇主要介绍node的安装与相关配置 官网: https://nodejs.org/en/ Linux: Windows:

  9. jmeter学习记录--07--jmeter元件

    通过jmeter元件可以模拟负载.参数化.设置关联.设置检查点.设置集合点.控制场景运行.监控测试结果等. 1.逻辑控制器:比如foreach控制器,查询到了订单并要对每个订单进行出库操作,以订单号作 ...

  10. 面试题(一续Spring)

    9.Spring体系结构和jar用途 参考https://blog.csdn.net/sunchen2012/article/details/53939253 spring官网给出了一张spring3 ...