如何編寫一個既可以作為first-class函數又可以作為higher-order函數的JavaScript函數?

例如,讓我們使用函數add。我想打電話給:

add(1, 2)(3, 4)

and

add(1, 2)

使用相同的實現。我嘗試過用以下方式編寫add函數:

var add = (a, b) => {
    return (c, d) => {
         return a + b + c + d;
    }
}

這對add(1,2)(3,4)很好,但對add(1,2)不起作用。我不確定如何在返回函數之前檢查函數是否傳遞了參數。

? 最佳回答:

由于函數(在被調用時)無法知道其返回值是否也會像函數一樣被調用,因此最好的方法是讓返回值可調用,并使用valueOf方法,以便它可以直接用作期望數字的更大表達式中的數字:

function add(...args) {
    let sum = 0;
    const f = function (...args) {
        for (const val of args) sum += val;
        return f;
    }
    f.valueOf = () => sum;
    return f(...args);
}

console.log(+add(1, 2)(3)(4, 5));

這里的“技巧”是+運算符強制其操作數強制為一個數字,這將隱式調用add求值為function-object的valueOf方法。該+運算符只是調用valueOf方法的眾多方法之一。再舉幾個例子:

console.log("result = " + add(1, 2)(3)(4, 5));
console.log(add(1, 2)(3)(4, 5) - 0);
console.log(add(1, 2)(3)(4, 5) * 1);
console.log(Number(add(1, 2)(3)(4, 5)));
主站蜘蛛池模板: 鲁丝片一区二区三区免费| 国产亚洲综合一区柠檬导航| 免费一本色道久久一区| 日韩一区二区三区四区不卡| 国产对白精品刺激一区二区 | 免费视频精品一区二区| 中文字幕无码一区二区三区本日| 国产91精品一区二区麻豆亚洲| 无码人妻精品一区二区三区99仓本 | 亚洲视频在线一区二区| 精品香蕉一区二区三区| 日本一区高清视频| 精品无码人妻一区二区三区品| 日韩AV片无码一区二区不卡| 久久久久人妻精品一区蜜桃| 日本一区午夜爱爱| 亚洲国产AV一区二区三区四区| 国产福利视频一区二区| 制服美女视频一区| 风间由美在线亚洲一区| 国产精品久久久久久麻豆一区| 无码人妻精品一区二区三区久久| 亚洲欧洲一区二区三区| 日本一区二区在线不卡| 国产一区二区三区电影| 亚洲午夜电影一区二区三区| 精品一区二区91| 国产精品视频一区二区三区不卡| 精品日韩一区二区| 一区二区精品久久| 国产精品一区二区三区99| 亚洲永久无码3D动漫一区| 变态调教一区二区三区| 国产午夜精品一区二区三区小说| 国产伦精品一区二区三区无广告| 国产一区二区免费在线| 好吊视频一区二区三区| 精品无码人妻一区二区免费蜜桃| 精品一区二区三区在线播放视频| 亚洲狠狠狠一区二区三区| 欧美av色香蕉一区二区蜜桃小说|