这两个关键字在平时编码中几乎难以用到,但它们既然存在于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的作用以及用法

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