我是靠谱客的博主 懦弱向日葵,最近开发中收集的这篇文章主要介绍JavaScript中的callee和caller的用法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

callee

callee是对象的一个属性,它一个指针,指向参数arguments对象的函数,用过argument.callee的方式来指向该函数;

看下面这段递归函数:

function factorial(num){
    if (num <= 1)
        return 1;
    else
        return num * factorial(num - 1);
}
let subFactorial = factorial;
factorial = null;
console.log(subFactorial(3));//报错

上面的代码会报下面的错误:
在这里插入图片描述

  • 我们把factorial()函数保存到一个subFactorial变量中,然后把-factorial设为null,只保留一个引用;
  • 但是在调用subFactorial()的时候会报错,为什么呢?我们不是已经把factorial()函数存到subFactorial中了吗?
  • 如果我们仔细看代码的话就会发现一个问题,在调用递归的时候我们还是需要调用factorial()函数才能实现,但是在我们将factorial设为null的情况下是访问不到的,所以这样非常的不方便;

于是我们采用callee的方式来解决这个问题:

function factorial(num){
    if (num <= 1)
        return 1;
    else
        return num * arguments.callee(num - 1)
}
let subFactorial = factorial;
factorial = null;
console.log(subFactorial(3));//6

将递归要调用的函数factorial()改为arguments.callee(),由于arguments.callee指向的就是正在执行的函数的指针,在函数内部直接调用,它指向的就是该函数本身,所以就算把factorial设为null也不会影响到递归的调用;

caller

caller是ECMAScript5提出给函数对象上添加一个属性,这个属性引用的是调用当前函数的函数,或者如果是全局作用域中调用的则为null;

废话少说,上代码:

function a(){
    b();
}
function b(){
    console.log(b.caller);
}
a();

打印的结果是a()函数的源代码:
在这里插入图片描述

很明显,这里已经可以看出来了,上面的代码调用了a()函数,a()中又执行了b(),最后b()函数打印出b.caller,这里的b.caller就是当前调用了b()函数的a()函数,所以打印出来的就是a()函数的源代码。

我们还可以用arguments.callee.caller的方式来降低他们之间的耦合度,比如:

function a(){
    b();
}
function b(){
    console.log(arguments.callee.caller);
}
a();

最后

以上就是懦弱向日葵为你收集整理的JavaScript中的callee和caller的用法的全部内容,希望文章能够帮你解决JavaScript中的callee和caller的用法所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部