我有一個測驗,在這種情況下我需要實作一個稱為 sum 的高階函式,它滿足以下要求:
sum(result => {console.log("-> ", result)});// -> prints: -> 0
sum(1)(result => {console.log("-> ", result)});// -> prints: -> 1
sum(1)(2)(result => {console.log("-> ", result)});// -> prints: -> 3
sum(1)(2)(4)(result => {console.log("-> ", result)});// -> prints: -> 7
我做了一個函式以通過遞回獲得無限柯里化,但我對回呼函式有點迷失。
let sum = a => !a ? 0 : b => b ? sum(a b) : a
console.log(sum()) -> 0
console.log(sum(1)()) -> 1
console.log(sum(1)(2)()) -> 3
console.log(sum(1)(2)(4)()) -> 7
uj5u.com熱心網友回復:
使用閉包來累積總和。當一個內部函式檢測到引數是一個函式時,它將呼叫帶有總和的回呼。否則它將在調整總和后回傳:
function sum(arg) {
let total = 0;
function inner(arg) {
if (typeof arg === "function") {
arg(total);
} else {
total = arg;
return inner;
}
}
return inner(arg);
}
sum(result => {console.log("-> ", result)});// -> prints: -> 0
sum(1)(result => {console.log("-> ", result)});// -> prints: -> 1
sum(1)(2)(result => {console.log("-> ", result)});// -> prints: -> 3
sum(1)(2)(4)(result => {console.log("-> ", result)});// -> prints: -> 7
如果函式不打算保持狀態,那么您可以使用this引數來傳遞總數:
"use strict";
function sum(arg) {
function inner(arg) {
if (typeof arg === "function") {
arg( this);
} else {
return inner.bind(this arg);
}
}
return inner.call(0, arg);
}
sum(result => {console.log("-> ", result)});// -> prints: -> 0
sum(1)(result => {console.log("-> ", result)});// -> prints: -> 1
sum(1)(2)(result => {console.log("-> ", result)});// -> prints: -> 3
sum(1)(2)(4)(result => {console.log("-> ", result)});// -> prints: -> 7
const foo = sum(0);
foo(100)(console.log); // 100
foo(1)(console.log); // 1
這里建議使用嚴格模式,但它也可以在草率模式下作業。在這種情況下,this引數被裝箱并再次拆箱。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/406974.html
標籤:
上一篇:添加第二個元素后第一個元素不切換
