早起版本的 JavaScript 沒有具名函數表達式(named function expression),所以在函數表達式裏麽沒有辦法實現遞歸。
比如下面實現階乘的函數:
function?factorial?(?n?)?{return?!(?n?>?1?)1?:?factorial(?n?-?1?)?*?n;}[1,2,3,4,5].map(factorial);
如果寫成函數表達式的話:
[1,2,3,4,5].map(?function(?n?)?{//?這裏要怎樣遞歸?
}?);
所以添加了 arguments.callee 來實現對執行函數本身的調用:
[1,2,3,4,5].map(?function(?n?)?{return?!(?n?>?1?)1?:?arguments.callee(?n?-?1?)?*?n;
}?);
但是現在的JavaScript 支持了具名函數表達式:
[?1,?2,?3,?4,?5?].map(?function?factorial(?n?)?{return?!(?n?>?1?)1?:?factorial(?n?-?1?)?*?n;
}?);
這樣寫有以下的好處:
可以像正常壹樣調用函數
不會在函數外面的作用域創建變量(IE8或者更早的瀏覽器還是會)
比起用 arguments 對象來說,性能更加優秀
同時,使用 arguments.callee 還會帶來函數引用優化問題和尾遞歸優化的問題。
以上部分內容資料來自:
/questions/103598/why-was-the-arguments-callee-caller-property-deprecated-in-javascript