首先,我們先定義一個函數,使用遞歸的思想寫求和的方法:
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))
