Люди древности так привязывали метод к контексту. В давние времена не существовало стрелочных функций.
В вашем примере мы передаём функцию
this.addFriend
в обработчик события
addNew
. JS так устроен что когда вы передаёте this.addFriend (куда угодно, хоть в обработчик, хоть в переменную), то будет передан только addFriend без this. Bind как раз нужен для того чтоб прибить FriendsContainer к контексту метода addFriend.
В современном мире принято делать так:
class FriendsContainer extends React.Component {
addFriend = (friend) = >{
this.setState((state) => ({
friends: state.friends.concat([friend])
}))
}
}
Это по сути тот же bind, только без лишних телодвижений.