为什么.bind()会添加可选参数?

时间:2018-03-20 13:09:42

标签: javascript ecmascript-5

我第一次使用.bind()时,由于传递给绑定函数的可选参数被预先添加,我被绊倒了。当我试图将事情移交给匿名事件处理函数时,这让我有了这样的想法:

$('#example').on('change', function(arg1, arg2, evt) {
    console.log(evt, arg1, arg2);
}.bind(null, arg1, arg2));

.bind()的MDN多次提到前置,但从未详细说明,所以我很好奇为什么 - 为什么我必须将arg1arg2放在{{{}之前1}}在函数参数中? 追加不会更容易理解,而且性能会更高一些吗?

2 个答案:

答案 0 :(得分:2)

如果附加绑定参数追加到调用时参数,行为将如下所示:

function foo(bar, baz) {}
const b = foo.bind(null, 42);

b();          // bar = 42
b('c');       // bar = 'c', baz = 42
b('c', 'd');  // bar = 'c', baz = 'd'

意思是,你的约束论点最终会无法预测,这可能是疯了。

如果您认为bindpartial applicationcurrying,前置也会更有意义:从功能上说,foo.bind(null, 42)返回部分应用功能,
它转为a -> b -> c(一个取两个值并返回三分之一的函数)
进入b -> c(一个只需要一个值并返回另一个值的函数)。

答案 1 :(得分:0)

bind()生成一个新函数,在调用时,调用调用.bind()的函数。

让我们将f命名为您在代码中使用的函数:

var g = function f(arg1, arg2, evt) {
    console.log(evt, arg1, arg2);
}.bind(null, arg1, arg2)

bind()生成一个新函数(存储在g中),它接受任意数量的参数(在本例中为一个)。
可以使用零个或多个参数调用g

只需要bind()的第一个参数;它是在this返回的函数内被引用为bind()的对象。 bind()的其他参数(如果存在)始终可在g中使用。

在此示例中,它们为arg1arg2,并且始终传递给ff的其他参数是g被调用时的参数。可能没有,一个或多个。

arg1arg2作为f调用中的第一个参数以及列表的其余部分(传递给g的参数)的自然选择最后。

如果将arg1arg2作为f的最后一个参数传递,则必须检查arguments.length内的f以查找最后两个参数及其代码变得很麻烦。