arguments.callee
函數(shù)內(nèi)粹懒, 有兩個特殊對象: arguments 和 this
arguments 的主要用途今魔, 是保存函數(shù)參數(shù)勺像,默認(rèn)包含所有傳入函數(shù)內(nèi)的參數(shù),但這個對象還有屬性错森,名為callee吟宦,callee是一個指針,指向該arguments對象所在的函數(shù)涩维,因此:
因此殃姓,經(jīng)典階乘函數(shù):
function fn(num){
? ? if(num <= 1) {? ? ? ? return 1
????}
? return num * fn(num-1)
}
也可以這么寫:
function fn(num){? ??
? ? if(num<=1){?
? ? ? ? return 1
????}
return num * arguments.callee(num-1)
}
那為啥要這么寫?在函數(shù)有名字并且函數(shù)名不會改變時,這么寫沒有必要蜗侈,只是函數(shù)的執(zhí)行與函數(shù)名耦合到了一起篷牌,為了解耦合,才使用arguments.callee() 的寫法踏幻,如下:
var fn2 = fn;? // fn引用上面的方法
fn2(3) // 6
fn = function(){return 0}? ? // 重寫fn 方法
fn2(3) //? ?6? ? ? ? // fn2依然返回預(yù)期的結(jié)果
fn(3)//? ?0? ? ? ? // fn 被重寫
fn創(chuàng)建了一個遞歸對象娃磺,fn2引用了該對象, 給fn重新賦值的時候叫倍,相當(dāng)于開辟了新內(nèi)存改變了fn的指針,此時fn2依然指向遞歸對象豺瘤,因此結(jié)果如上吆倦。
但arguments.callee() 現(xiàn)在棄用了,原因: arguments是一個很大的對象坐求,不僅僅只有我們看到的這樣蚕泽,每次遞歸調(diào)用時都要重新創(chuàng)建該對象,因此操作arguments很消耗瀏覽器性能桥嗤。
argumetns是棄用了须妻,但是如果還想用上面的寫法,那么泛领。荒吏。。渊鞋。
function fn(num){? ??
return (function infn(num){
????if(num <=1){? ??
????????return 1
? ? }
? ? return num * infn(num-1)
? ? })(num)
}
hhhhhhhhhhhhhhhhh, 就是用一個函數(shù)把遞歸包一下绰更。。锡宋。儡湾。。好像不是什么很好的方案执俩,但實用徐钠,這樣也能實現(xiàn)解耦合的目的。