首先,我們先定義一個函數,使用遞歸的思想寫求和的方法:
function sum(x, y) { if (y > 0) { return sum(x + 1, y - 1); } else { return x; } }
當我們執行的時候
sum(1, 100000000000)
這個時候會出現一個堆棧溢出的錯誤,在es6里面,有一個為遞歸優化的方法可以解決,即在最后一步調用函數,且實現函數的柯里化(多參函數轉換成單參數函數),但是需要開啟嚴哥模式,普通模式下會報錯,這個時候我再阮大神的es6書籍里面,看到了蹦床函數,結合.bind,使函數調用的時候是自己的方法,但是確是另一個函數對象,不是本身,這個時候就不會造成內存的泄露,發生堆棧溢出了,實現代碼如下:
function trampoline(f) { while (f && f instanceof Function) { f = f(); } return f; }
function sum(x, y) { if (y > 0) { return sum.bind(null, x + 1, y - 1); } else { return x; } }
trampoline(sum(1, 100000))