JavaScript:如何将额外参数传递给回调

时间:2016-02-15 10:20:52

标签: javascript functional-programming

我有一个问题,现在已经让我烦恼了一段时间。

我们说我有以下数组:

var array = [1, 2, 3]

现在我有一个类似的功能:

function print(num, str) {
    console.log(str + ": " + num);
}

是否可以调用forEach方法并将字符串传递给它?

// how do I pass "str"?
array.forEach(print);

谢谢!

3 个答案:

答案 0 :(得分:4)

这里有两个选项:

要么交换参数,要先str。然后,您可以使用function.bind绑定函数的第一个参数:

function print(str, num) {
    console.log(str + ": " + num);
}

array.forEach(print.bind(null, 'someStr'));

或者,您也可以创建一个新的(匿名)函数,它只是将一些值传递给第二个参数:

array.forEach(function (item) { print(item, 'someStr'); });

使用ES6和箭头功能,这甚至会更漂亮:

array.forEach(item => print(item, 'someStr'));

两种解决方案都具有非常相似的效果,因为它们创建了一个新的函数对象,然后传递给forEach。对你更有意义的取决于你的用例。

就像一个注释:你只需要记住传递给forEach的回调实际上最多需要三个参数(项目,项目的索引和数组本身),所以当你通过时要小心一个接受其他附加参数的函数。您可以再次使用本地函数来解决此问题。

答案 1 :(得分:2)

不是在这种特殊情况下。这里简单的解决方案是使用匿名函数包装器:

array.forEach(function (i) { print(i, str); });

如果您将参数反转为print,您可以更优雅地执行此操作:

function print(str, num) { .. };

array.forEach(print.bind(null, str));

str将绑定为第一个参数,forEach在调用回调时传递的任何参数都在第二个,第三个等位置传递。

答案 2 :(得分:1)

你去吧

var array = [1, 2, 3];

function print(str, num) {
    console.log(str + ": " + num);
}

var str = 'someString';
array.forEach(print.bind(null, str));