javascript - 打印咖喱函数不显示捕获的参数
问题描述
如果我这样定义一个咖喱函数:
const gt = x => y => y > x
我希望gt(5)
回报y => y > 5
但是gt(5)
(或gt(5).toString()
)返回y => y > x
如何获取捕获的参数?
解决方案
我希望 gt(5) 返回 y => y > 5
JavaScript 不是这样工作的。gt(5)
is返回的函数的代码,y => y > x
只是该代码在标识符x
解析为具有该值的绑定的环境中执行,5
因为它是对该环境的闭包。toString
on functions 返回函数源代码的字符串版本[ native code ]
(或y => y > x
. 返回的字符串toString
不包括该代码运行的环境。
也可以看看:
- JavaScript 的闭包是如何工作的?- 在这里
- 闭包并不复杂——在我以前的贫血博客上(使用了一些过时的术语,我可能应该解决这个问题)
正如@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 解析器来进行替换。
推荐阅读
- python - Tkinter Checkbutton 不会改变变量
- react-native - 在 react native 中,如何使用 FlatList 自定义警报文本数组
- python - Selenium Python - is_displayed() 函数的问题
- python-3.x - 如何设置循环中的最大迭代次数?
- json - 使用 API 密钥/秘密密钥访问私有 JSON 文件失败
- java - 带有 OOP 的 Java 应用程序杂货订购逻辑
- javascript - Javascript:单击元素而不是按钮
- java - 在 Spring Boot 上读取超时
- c# - ormlite async 方法使用 miniprofiler 抛出强制转换异常
- java - 如何跟踪曲目的结尾(MediaPlayer)