关键词
- caller :返回一个函数的引用,这个函数调用了当前的函数
- callee:返回正在执行的函数本身的引用,它是arguments的一个属性
下面我们做个小demo
var a = function() {
if(a.caller){
console.log(a.caller);
}else{
console.log("没有执行");
}
}
a(); // 没有执行
var b = function() {
a();
}
b(); // 返回函数
只用在非顶层调用的时候,caller才有值
callee有一个length属性,可以用来获得形参的个数,因此可以用来比较形参和实参个数是否一致
//用于验证参数
function calleeLengthDemo(arg1, arg2) {
if (arguments.length == arguments.callee.length) {
console.log("验证形参和实参长度正确!");
/*return;*/
} else {
console.log("实参长度:" + arguments.length); //实参长度:4
console.log("形参长度: " + arguments.callee.length); //形参长度:2
}
}
calleeLengthDemo(1,2,3,4);
根据 callee 的特性,还可以用来递归匿名函数
//一般递归
var sum = function(n) {
if (n == 1) return 1;
return n + sum(n - 1);
};
console.log(sum(100));
//callee递归
var sum1 = function (n) {
if (n == 1){
return 1;
}else{
return n + arguments.callee(n - 1);
}
};
console.log(sum1(100));
js 中还有个bind方法,也能有上面的效果
var person = {
name: '段王爷',
job: '大理国王',
gender: '男的',
show: function() {
return this.name + this.job + this.gender;
}
}
console.log(person.show());
var reShow = person.show.bind({
name:'段誉',
job: '花花公子'
});
console.log(reShow());