javascript - 将额外变量传递给具有预定义参数的函数,例如 Array.Reduce
问题描述
我有这样的减速器功能
let reducer = (acv, cv) => {
return acv += cv;
}
function createMenus(arr){
let someValue = getNewValue();
arr.reduce(reducer, '');
//I want to bind my above someValue to reducer function so, I can append it to my string like below
}
let reducer = (acv, cv, someValue) => {
return acv += (cv+someValue);
}
我尝试使用bind()
但不成功。
解决方案
您可以在代码中使用闭包来发挥自己的优势。
您可以创建一个返回函数的函数。
createMenus
下面接受一个参数并使用传递给它的值,返回另一个函数,该函数将在数组的 reduce 函数中运行,因此调用reducer(someValue)
实际上返回另一个函数。该函数是传递给 reduce 的(以与上面相同的方式)。
function getNewValue() {
return 'foo';
}
function reducer(someValue) {
return (acv, cv) => {
return acv += (cv + someValue);
}
};
function createMenus(arr){
let someValue = getNewValue();
return arr.reduce(reducer(someValue), '');
}
console.log(createMenus(['a', 'b', 'c']));
更新
正如评论中提到的@george,您还可以使用箭头函数来完成同样的事情。语法要短得多,但可读性在旁观者看来。
let reducer = value => (a, v) => a + (v + value);
即使您发现它更具可读性,使用此方法也可能会使您的代码更难调试,因为与在命名函数中相比,跟踪发生在匿名函数中的错误可能更难。
推荐阅读
- sql-server - 如何替换SQL中最右边的字符串
- jenkins - Ansible jenkins_plugin 模块返回“HTTP 错误 403:请求中未包含有效的 crumb”
- mysql - 单元测试 sqlmock 因 sql 更新而失败
- android - Cordova 闪屏目录名错误
- swift4 - 如何为所有 UIKIt 覆盖一次方法
- swiftui - 如何从 SwiftUI 中的两个不同视图分支发送事件?
- javascript - 如何访问和遍历嵌套数组
- javascript - React 本机应用程序显示一个错误,指出即使提供了密钥,密钥也将未定义
- php - 如何使用 Laravel - Maatwebsite 将 excel 单元格设置为只读?
- python-3.x - SSDP M-search 不适用于单播 - 单个 IP