可以让某人解释雄辩示例的绑定功能的工作



iSinset需要两个参数,但是绑定仅通过theset作为第一个参数。在这种情况下,我无法弄清楚绑定方法如何工作

function isInSet(set , person) {
return set.indexOf(person.name) > -1;//checks for existence of person.name in theSet
}
console.log(ancestry .filter(function(person) {
return isInSet( theSet , person) ;
}) ) ;
// ! [{ name : " Maria van B r u s s e l " , ...} ,
// { name : " Carel H a v e r b e k e " , ...}]
console.log(ancestry.filter(isInSet.bind(null, theSet)))  ;//**how does this work?**
// !... same result

bind()从调用的函数中创建一个新功能。它将新创建函数中的this关键字设置为您传递它的第一个参数(如果传递null,则不会覆盖默认的this关键字)。您也可以将额外的参数传递给bind(),如果这样做,它们将始终插入新功能中。因此,例如,假设您有一个sum函数,该函数需要2个参数。

function sum (a, b) {
  return a + b;
}

现在,我们可以使用bind()从此创建一个新功能,并始终通过一个参数。

var boundSum = sum.bind(null, 2);

这将始终将2绑定为sum()函数中的第一个参数。现在,每当您调用boundSum()函数时,它只会采用一个参数,因为2已经绑定了。

boundSum(3); // <-- this would return 5

您的示例正在使用类似的原理。因为您正在调用isInSet.bind(null, theSet),所以始终将theSet绑定到isInSet函数中传递的第一个参数。但是,它仍然缺少第二个参数。它起作用的原因是因为您将其放置在ancestry.filter()功能中。filter()本质上是在数组上循环,并将每个元素传递到其内部功能(检查文档)。因此,ancestry数组中的每个元素都传递到该界限,这使其成为isInSet()的第二个参数。

几次阅读本书中的文本,并比较未结合的版本和绑定版本。

在功能上调用.bind(),返回一个新功能,其中一些参数已经填写。ISINSET函数,期望两个参数:要过滤的集合和具有名称的人。

数组的.filter()方法期望一个参数,即必须将数组的每个元素发送到的函数。因此,当您查看未结合版本时,您会看到使用的过滤器功能,只需返回isInSet(theSet, person)

因此,要使两个兼容,我们.bind()仅使用一个左一个参数(即'person')创建一个新函数,该函数绑定到这些函数。因此,每当bind返回的新功能被调用时,它将使用这些函数作为第一个参数,并且只会期望一个参数"人"。在这里,人是我们未绑定的原始ISINSET函数的第二个参数,用作绑定函数的第一个也是唯一的参数。

因此,我们在使用绑定后完全需要我们需要的东西。一个将"人"作为参数的函数,并且将始终在同一数组中(theset)。

如果您阅读了.bind()的文档,则会发现它接受了一个参数列表。第一个论点是"这个"论点。因此,如果您有一个在其中使用"此"的函数,并且要将其绑定到例如。一个对象,您可以使用第一个参数。例如。myFunc.bind( objectToCallUpon, firstArg, secondArg );由于我们实际上没有在isinset()函数中使用"此"参数,因此我们只是将" null"作为'this'值传递。

使用的所有其他参数是您要制作"固定"的Isinset的参数。由于我们希望第一个参数始终为theset,因此我们绑定了该值。

如果ISINSET函数将接受两个参数,您将使用: isInSet.bind( null, theSet, secondParameter );

最新更新