為什麼Arguments.callee.caller 屬性在JavaScript 中被棄用
在JavaScript 中,arguments.callee.caller 被引入,後來被棄用。然而,有些瀏覽器仍然支援它,而有些瀏覽器則完全省略了它。問題出現了:為什麼這個看似有用的功能被放棄了?
遞歸的需要
在 JavaScript 的早期版本中,不支援命名函數表達式。這使得創建遞歸函數表達式變得具有挑戰性。
例如,考慮階乘函數:
[1,2,3,4,5].map(factorial);
如果沒有命名函數表達式,此程式碼將無法運作。 argument.callee 屬性提供了一個解決方案:
[1,2,3,4,5].map(function(n) { return (!(n>1))? 1 : arguments.callee(n-1)*n; });
Arguments.callee
Arguments.callee 的缺點
Arguments.callee 的缺點
Arguments.callee. arguments.callee 有幾個缺點:
它阻止了內聯和尾遞歸等最佳化。[1,2,3,4,5].map(function factorial(n) { return (!(n>1))? 1 : factorial(n-1)*n; });
它在遞歸呼叫期間改變了 this 的值。
這種方法比arguments.callee有幾個優點:
它允許像其他函數一樣呼叫函數。 它不會污染命名空間。 它在遞歸呼叫中保持 this 的完整性。 它透過消除存取arguments物件的開銷來提高效能。 結論棄用arguments.callee.caller對於提高JavaScript的效能至關重要最佳化功能並確保函數呼叫期間行為一致。命名函數表達式為遞歸和存取呼叫上下文提供了更可靠、更有效率的替代方案。以上是為什麼 JavaScript 中不建議使用「arguments.callee.caller」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!