首页 > 解决方案 > 打印咖喱函数不显示捕获的参数

问题描述

如果我这样定义一个咖喱函数:

const gt = x => y => y > x

我希望gt(5)回报y => y > 5

但是gt(5)(或gt(5).toString())返回y => y > x

如何获取捕获的参数?

标签: javascriptcurrying

解决方案


我希望 gt(5) 返回 y => y > 5

JavaScript 不是这样工作的。gt(5)is返回的函数的代码,y => y > x只是该代码在标识符x解析为具有该值的绑定的环境中执行,5因为它是对该环境的闭包。toStringon functions 返回函数源代码的字符串版本[ native code ]y => y > x. 返回的字符串toString不包括该代码运行的环境。

也可以看看:


正如@VLAZ在评论中指出的那样,您可以覆盖toString函数的默认值以赋予它您想要的行为。如果您不介意重复(这几乎不可避免地会导致维护问题):

const gt = x => {
    const fn = y => y > x;
    fn.toString = () => `y => y > ${x}`;
    return fn;
};
console.log(String(gt(5)));

...或者如果您想toString使用与原型上的版本相同的可枚举性等进行定义:

Object.defineProperty(fn, "toString", {
    value: () => `y => y > ${x}`,
    writable: true,
    configurable: true,
});

在一般情况下这样做需要适当的 JavaScript 解析器来进行替换。


推荐阅读