簡體   English   中英

可以請某人從雄辯的角度解釋此示例的bind函數的工作

[英]can please someone explain the working of bind function for this example from eloquent

isInSet需要兩個參數,但是bind僅將theSet作為第一個參數傳遞。 在這種情況下,我無法弄清楚bind方法如何工作

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() ,如果這樣做,它們將始終插入到新函數中。 舉例來說,假設您有一個帶2個參數的sum函數。

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()本質上遍歷一個數組,並將每個元素傳遞給它內部的函數( 請檢查docs )。 因此, ancestry數組中的每個元素都將傳遞給該綁定函數,這使其成為isInSet()的第二個參數。

幾次閱讀本書中的文字,然后比較未綁定版本和綁定版本。

在函數上調用.bind() ,返回一個新函數,其中一些參數已填充。isInSet函數需要兩個參數:要過濾的集合和一個有名字的人。

數組的.filter()方法需要一個參數,即數組中每個元素必須發送到的參數。 因此,當您查看未綁定版本時,您會看到所使用的過濾器函數僅返回isInSet(theSet, person)

因此,為了使兩者兼容,我們使用.bind()創建一個新函數,該函數只剩下一個綁定到theSet的參數(即“ person”)。 因此,每次由bind返回的新函數被調用時,它將使用Set作為它的第一個參數,並且只會期望有一個參數“ person”。 這里,person(我們未綁定的原始isInSet函數的第二個參數)用作綁定函數的第一個也是唯一的參數。

因此,使用完綁定后,我們便有了所需的東西。 該函數將“ person”作為參數,並且始終在同一數組(theSet)中查找。

如果閱讀.bind()的文檔,則會看到它接受可變的參數列表。 第一個參數是“ this”參數。 因此,如果您有一個在其中使用“ this”的函數並將其綁定到例如。 一個對象,可以使用1st參數。 例如。 myFunc.bind( objectToCallUpon, firstArg, secondArg ); 由於我們實際上並未在isInSet()函數中使用'this'參數,因此我們僅將'null'作為'this'值傳遞。

使用的所有其他參數是您要使其為“固定”的isInSet的參數。 由於我們希望第一個參數始終為TheSet,因此我們綁定了該值。

如果isInSet函數將接受兩個參數,則可以使用: isInSet.bind( null, theSet, secondParameter );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM