请求解析JavaScript高阶函数noisy的调用语法:为何用noisy(Math.min)(3,2,1)?
理解
noisy(Math.min)(3,2,1) 的调用方式 嘿,我刚好看过《Eloquent JavaScript》里这段代码,完全懂你的困惑——这种连续调用的写法一开始确实有点绕,咱们一步步拆解就清楚了:
首先,得先搞明白noisy这个高阶函数到底干了啥:
- 它接收一个函数
f作为参数(这里就是Math.min) - 然后返回一个新的箭头函数,这个新函数会帮我们把原函数
f的调用过程“包装”起来:先打印调用参数,执行原函数,再打印返回结果,最后返回原函数的结果
现在来看noisy(Math.min)(3,2,1)的执行步骤:
第一步:执行
noisy(Math.min)
把Math.min传入noisy,这时候noisy会返回那个包装好的箭头函数。你可以把这一步单独拎出来看:const wrappedMin = noisy(Math.min);现在
wrappedMin就是那个自带日志功能的新函数。第二步:调用返回的新函数
wrappedMin(3,2,1)
这时候就会触发箭头函数里的逻辑:- 打印
"calling with", [3,2,1] - 调用
Math.min(3,2,1)得到结果1 - 打印
"called with", [3,2,1], ", returned", 1 - 最后返回
1
- 打印
所以noisy(Math.min)(3,2,1)其实就是把“创建包装函数”和“调用包装函数”这两步合并成了一行代码,本质和分开写是完全一样的。这种写法在高阶函数的场景里特别常见——比如给原函数加日志、加缓存这类额外功能,又不想修改原函数本身,用这种“函数返回函数”的方式就能轻松实现。
简单来说,只要记住高阶函数的核心是“输出另一个函数”,看到连续的()就拆成两步理解,一下子就通透啦~
内容的提问来源于stack exchange,提问作者root44
相关产品推荐
相关产品推荐

