调用curried函数而不传递另一个参数

时间:2016-09-28 20:42:33

标签: javascript functional-programming currying

我有一个简单的函数,它接受一个参数

fn = function(argument) {console.log(argument)}

setInterval中,我想调用该函数并传递一个外部变量:

argument = 1
setInterval(<MY FUNCTION WITH ACCESS TO ARGUMENT>, 1000)

我意识到我可以用更高阶的函数来做,即

fn = function(argument) {
  function () {
    console.log(argument)
  }
}
argument = 1
setInterval(fn(argument), 1000)

这确实有效,但我想知道是否可以使用curry完成。

我试过了:

fn = _.curry(fn)("foo")
// since the function takes only one argument,
// here it is invoked and no longer can be
// passed as a function to setInterval

fn = _.curry(fn, 2)("foo")
// setting the arity to 2 makes it so the function
// isn't invoked. But setInterval does not pass
// the additional argument and so it never ends
// up getting invoked.

我觉得这些咖喱的例子中我有些遗漏。我或者咖喱会不会在这里帮忙吗?

1 个答案:

答案 0 :(得分:1)

确实lodash _.curry似乎不适合您的用例。

但您可以使用vanilla JavaScript bind

  

bind()方法创建一个新函数,在调用时,将其this关键字设置为提供的值,并在调用新函数时提供任何前面提供的给定参数序列。 / p>      

语法

fun.bind(thisArg[, arg1[, arg2[, ...]]])

在您的情况下,您的代码将如下所示:

fn = function(argument) {console.log(argument)}

var argument = 1
setInterval(fn.bind(this, argument), 1000)

Lodash替代

如果你真的想用lodash的方式来做,fn.bind(thisArg, ...args)的等价物是_.bind(fn, thisArg, ...args)。如果您对设置this引用不感兴趣,那么可以使用_.partial(fn, ...args)保存一个参数:

  

创建一个函数,调用 func ,并在其收到的参数前加上 partials 。此方法类似于_.bind,但它不会改变this绑定。