在传递给函数之前转换参数,而不使用javascript中的闭包
Transform argument before passing to a function without use of a closure in javascript
我不时发现自己在节点中使用以下模式。
var foobar = function(x, y) {
foo(x, bar(y));
};
您可以想象,您可能会将此模式视为一个匿名闭包,它在对结果执行转换bar
后调用回调函数foo
。
... , function(err, result) {
callback(err, transform(result));
} ...
我的问题;有没有办法以优雅的方式简化这个模式?理想情况下,它不需要一个新的实用函数(如下)来工作,而是利用下划线(或类似的)。
尝试的解决方案
foo
和bar
的组合很接近(这让我考虑下划线的_.compose
的变体),但转换后的值只是传递给foo
的参数之一。
我的不雅的解决方案需要一个新的实用函数(可能不适用于非原始参数)是:
function partialCompose(func, transform, position) {
var args = Array.prototype.slice.call(arguments, 3);
args[position] = transform(args[position]);
return func.apply(this, args);
}
//usage
var foobar = partialCompose.bind(this, foo, bar, 1)
就我个人而言,我认为这比最初的模式更糟糕。有人能改进吗?感觉它应该相对简单,我错过了一些明显的东西。
我最近发现了Ramda:库
Javascript程序员的实用函数库。
我早期的印象似乎是,这是一种对下划线和lodash等库的扩展和改进,同时更严格地坚持纯功能风格。方便的是,Ramda包含了useWith
,它解决了我最初问题的通用版本。它被描述为:
接受函数
fn
和任意数量的transformer函数,并返回一个新函数。当调用新函数时,它会调用函数fn
,其参数包括对新函数的连续参数调用每个提供的处理程序的结果。
换句话说,我原来的foobar
模式变成了:
//transform the 1st passed argument with R.identity()
//and the 2nd with bar(), pass the results to foo
var foobar = R.useWith(foo, R.identity, bar);
我仍然不知道有什么方法可以通过下划线或lodash开箱即用来实现这一点,这意味着至少就目前而言,Ramda值得进一步研究。
相关文章:
- for循环中的JavaScript闭包
- Javascript闭包-如何防止内存泄漏
- Javascript.闭包和dynamic'这'实际上具有约束力
- 用于添加两个数字的javascript闭包的用法
- 什么'这个javascript闭包的区别是什么
- 我可以使用JavaScript闭包添加数字吗
- javascript闭包:保护内部变量
- JavaScript闭包&回调函数
- 这些被认为是Javascript闭包吗
- JSHint 错误“对象不支持此属性或方法”用于 javascript 闭包
- JavaScript闭包的效果如何
- JavaScript 闭包和 for 循环
- 在谷歌地图示例中为 Ajax 调用制作一个 JavaScript 闭包
- JavaScript闭包和返回数组元素
- 如何在严格模式下实现以下JavaScript闭包
- 请解释这个Javascript闭包练习
- JavaScript闭包和变量引用
- Javascript闭包覆盖函数表达式
- Javascript闭包错误
- 为什么JavaScript闭包不能与预定义的函数一起使用