javascript 中 caller 与 callee 的作用以及用法

javascript 中 caller 与 callee 的作用以及用法这两个关键字在平时编码中几乎难以用到 但它们既然存在于 javascript 语言体系中 那么还是有必要了解下 caller 是 javascript 函数类型的一个属性 它引用调用当前函数的函数 function func alert func caller

大家好,我是讯享网,很高兴认识大家。

这两个关键字在平时编码中几乎难以用到,但它们既然存在于javascript语言体系中,那么还是有必要了解下。

caller 是 javascript 函数类型的一个属性,它引用调用当前函数的函数

 function func() { 
    alert(func.caller); } function func1() { 
    func(); } func1(); 

讯享网

比如上面的代码, 因为 func 函数是被 func1 函数调用的, 所以 func 函数中对 caller 的引用就是 func1 函数。如果 func 函数直接在顶层的 javascript 环境中被调用,那么 caller 将返回 null。

我们可以利用 caller 的特性跟踪函数的调用链:

讯享网 function func() { 
    let caller = func.caller; while(caller != null) { 
    console.log(caller.name); caller = caller.caller; } } function func1() { 
    func(); } function func2() { 
    func1(); } function func3() { 
    func2(); } func3(); 

以上代码将 func3 到 func 的函数调用链打印出来。


讯享网

callee 则不是函数对象的属性,它是函数上下文中 arguments 对象的属性:

 function func() { 
    alert(arguments.callee); } 

它引用的是函数自身,在上面的代码中,arguments.callee 引用的就是 func 函数本身。既然他引用的是函数本身,那么似乎显得有点多余,当我们需要在函数体内使用函数本身时,直接通过函数名调用就可以了,干嘛还要多此一举的通过 arguments.callee 这样去调用。然而我觉得 callee 存在的意义可能是想解耦函数本身对函数名称的依赖吧, 比如说在递归的环境下,函数内部通常还要调用函数本身, 而调用函数本身就免不了硬编码函数名称, 如果函数名称有变化, 那么函数中的代码也需要修改,使用 callee 就可以避免此类情况。

讯享网 function factorial( num ) { 
    if( num == 1 ) { 
    return 1; } let result = num * factorial(num - 1); return result; } alert(factorial(100)); 

上面的阶乘函数通过callee可以改造成:

 function factorial( num ) { 
    if( num == 1 ) { 
    return 1; } let result = num * arguments.callee(num - 1); return result; } alert(factorial(100)); 

如此同样实现递归, 但是可以做到函数体不依赖函数名称。


转载自 简书 大侠陈 的文章 javascript中caller与callee的作用以及用法

小讯
上一篇 2025-03-16 21:32
下一篇 2025-03-27 16:40

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/73277.html