我是靠谱客的博主 健壮帽子,最近开发中收集的这篇文章主要介绍callee与caller的区别Javascript arguments.callee和caller的区别,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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的区别Javascript arguments.callee和caller的区别的全部内容,希望文章能够帮你解决callee与caller的区别Javascript arguments.callee和caller的区别所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部