這兩天在查閱資料的時(shí)候發(fā)現(xiàn)了一些之前沒見過的小內(nèi)容
1.caller
這個(gè)方法一般來說用的很少,就簡單的介紹一下
var a = function(){
console.log(a.caller);
}
a();
var b = function(){
a();
}
b();
這里會有兩個(gè)打印,第一個(gè)打印是null,第二個(gè)打印的是b所對應(yīng)的函數(shù).第一次打印是window去調(diào)用的a函數(shù),window是頂層調(diào)用,所以打印的是null,第二個(gè)打印是在b函數(shù)里進(jìn)行,這樣就能通過a函數(shù)找到對應(yīng)的函數(shù)調(diào)用者.所以caller作用就是返回當(dāng)前這個(gè)函數(shù)的調(diào)用者,在在函數(shù)中調(diào)用有效,否則就返回null.
可以打印一下a.caller的typeof,返回的是function,但是為了防止函數(shù)的循環(huán)調(diào)用,a.caller()會報(bào)錯(cuò)的,綜上來看,這個(gè)屬性,真沒啥用.
2.callee
callee跟caller外觀很像,但是callee是函數(shù)arguments的屬性,它會返回當(dāng)前這個(gè)正在被調(diào)用的函數(shù)
function test(){
console.log(arguments.callee);
}
test(10, 20)
打印的就是test這個(gè)函數(shù),callee只有一個(gè)屬性,length,這個(gè)屬性的作用是函數(shù)的形參個(gè)數(shù),這要跟arguments.length有區(qū)別,后者是實(shí)參個(gè)數(shù)
function test(a){
console.log(arguments.callee.length); // 1
console.log(arguments.length); // 2
}
test(10, 20)
可以通過這個(gè)屬性,能實(shí)現(xiàn)遞歸函數(shù)的作用,下面就通過他來實(shí)現(xiàn)以下5的階乘
function test(a){
if(a == 1){
return 1;
}
return arguments.callee(a - 1) * a;
}
console.log(test(5)); // 120