箭頭函式寫法 箭頭函式 語法說明

2021-10-16 19:00:16 字數 1322 閱讀 4681

該樓層疑似違規已被系統摺疊 隱藏此樓檢視此樓

遞迴函式的改寫

尾遞迴的實現,往往需要改寫遞迴函式,確保最後一步只呼叫自身。做到這一點的方法,就是把所有用到的內部變數改寫成函式的引數。比如上面的例子,階乘函式 factorial 需要用到乙個中間變數total,那就把這個中間變數改寫成函式的引數。這樣做的缺點就是不太直觀,第一眼很難看出來,為什麼計算5的階乘,需要傳入兩個引數5和1?

兩個方法可以解決這個問題。方法一是在尾遞迴函式之外,再提供乙個正常形式的函式。

function tailfactorial(n, total) {

if (n === 1) return total;

return tailfactorial(n - 1, n * total);

function factorial(n) {

return tailfactorial(n, 1);

factorial(5) // 120

上面**通過乙個正常形式的階乘函式factorial,呼叫尾遞迴函式tailfactorial,看起來就正常多了。

函式式程式設計有乙個概念,叫做柯里化(currying),意思是將多引數的函式轉換成單引數的形式。這裡也可以使用柯里化。

function currying(fn, n) {

return function (m) {

return fn.call(this, m, n);

function tailfactorial(n, total) {

if (n === 1) return total;

return tailfactorial(n - 1, n * total);

const factorial = currying(tailfactorial, 1);

factorial(5) // 120

上面**通過柯里化,將尾遞迴函式tailfactorial變為只接受乙個引數的factorial。

第二種方法就簡單多了,就是採用 es6 的函式預設值。

function factorial(n, total = 1) {

if (n === 1) return total;

return factorial(n - 1, n * total);

factorial(5) // 120

上面**中,引數total有預設值1,所以呼叫時不用提供這個值。

總結一下,遞迴本質上是一種迴圈操作。純粹的函式式程式語言沒有迴圈操作命令,所有的迴圈都用遞迴實現,這就是為什麼尾遞迴對這些語言極其重要。對於其他支援「尾呼叫優化」的語言(比如lua,es6),只需要知道迴圈可以用遞迴代替,而一旦使用遞迴,就最好使用尾遞迴。

箭頭函式寫法 箭頭函式

1 箭頭函式介紹 es6 let fn v v console.log fn 好酷的箭頭函式!好酷的箭頭函式!es5 let fn function v 和return省略掉 v v v 相當於 function v 和return v 和return時,如果返回的內容是乙個物件,物件需要用括號 括...

箭頭箭頭函式

var fn function a 一樣 jineng function 箭頭函式外面指向誰就指向誰 有function.console.log fn3 1 像函式表示式 this指向不變.不能作為建構函式 不能使用new 返回物件的話.外部用括號 var fn7 name asdfnasd age...

箭頭函式寫法 MLTT 函式型別

函式型別在初中階段就接觸到了 如果 如何構造這樣乙個型別的元素呢?給定乙個表示式 由這個表示式就可以構造乙個函式 那麼 這裡 是沿襲hott書 1 中的記號,代表 根據定義,前者就是後者 也就是說,可以在任意地方將式子的左右側互換。這會在相等型別的討論中進一步解釋。另一種寫法就是 抽象 其中 可以省...