我第一次使用.bind()时,由于传递给绑定函数的可选参数被预先添加,我被绊倒了。当我试图将事情移交给匿名事件处理函数时,这让我有了这样的想法:
$('#example').on('change', function(arg1, arg2, evt) {
console.log(evt, arg1, arg2);
}.bind(null, arg1, arg2));
.bind()的MDN多次提到前置,但从未详细说明,所以我很好奇为什么 - 为什么我必须将arg1
和arg2
放在{{{}之前1}}在函数参数中? 追加不会更容易理解,而且性能会更高一些吗?
答案 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'
意思是,你的约束论点最终会无法预测,这可能是疯了。
如果您认为bind
为partial application或currying,前置也会更有意义:从功能上说,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
中使用。
在此示例中,它们为arg1
和arg2
,并且始终传递给f
。 f
的其他参数是g
被调用时的参数。可能没有,一个或多个。
将arg1
和arg2
作为f
调用中的第一个参数以及列表的其余部分(传递给g
的参数)的自然选择最后。
如果将arg1
和arg2
作为f
的最后一个参数传递,则必须检查arguments.length
内的f
以查找最后两个参数及其代码变得很麻烦。