caller和callee

caller返回一个函数的引用,这个函数调用了当前的函数;callee放回正在执行的函数本身的引用,它是arguments的一个属性

#caller

caller返回一个函数的引用,这个函数调用了当前的函数。
使用这个属性要注意:
1 这个属性只有当函数在执行时才有用
2 如果在JavaScript程序中,函数是由顶层调用的,则返回null

functionName.caller: functionName是当前正在执行的函数。

1
2
3
4
5
6
7
var a = function() {
alert(a.caller);
}
var b = function() {
a();
}
b();

上面的代码中,b调用了a,那么a.caller返回的是b的引用,结果如下:

1
2
3
var b = function() {
a();
}

如果直接调用a(即a在任何函数中被调用,也就是顶层调用),返回null:

1
2
3
4
5
6
7
8
var a = function() {
alert(a.caller);
}
var b = function() {
a();
}
//b();
a();

输出结果:null

#callee

callee放回正在执行的函数本身的引用,它是arguments的一个属性
使用callee时要注意:
1 这个属性只有在函数执行时才有效
2 它有一个length属性,可以用来获得形参的个数,因此可以用来比较形参和实参个数是否一致,即比较arguments.length是否等于arguments.callee.length
3 它可以用来递归匿名函数。

1
2
3
4
5
6
7
var a = function() {
alert(arguments.callee);
}
var b = function() {
a();
}
b();

a在b中被调用,但是它返回了a本身的引用,结果如下:

1
2
3
var a = function() {
alert(arguments.callee);
}

1 :caller 返回一个调用当前函数的引用 如果是由顶层调用的话 则返回null

(举个栗子哈 caller给你打电话的人 谁给你打电话了 谁调用了你 很显然是下面a函数的执行 只有在打电话的时候你才能知道打电话的人是谁 所以对于函数来说 只有caller在函数执行的时候才存在)

1
2
3
4
5
6
7
8
9
10
11
var callerTest = function() {
console.log(callerTest.caller);
};
function a() {
callerTest() ;
}
a() ;//输出function a() {callerTest();}
callerTest() ;//输出null

2 :callee 返回一个正在被执行函数的引用 (这里常用来递归匿名函数本身 但是在严格模式下不可行)

​ callee是arguments对象的一个成员 表示对函数对象本身的引用 它有个length属性(代表形参的长度)

1
2
3
4
5
6
7
var c = function(x,y) {
console.log(arguments.length,arguments.callee.length,arguments.callee)
};
c(1,2,3);
//输出3 2
function(x,y){console.log(arguments.length,arguments.callee.length,arguments.callee)}

本文结束,感谢阅读。

本文作者:melody0z
本文链接:https://melodyvoid/
欢迎转载,转载请注明文本链接

坚持原创技术分享,您的支持将鼓励我继续创作!