Я прочитал много теории о call(), apply() и bind().
Я не могу понять, можем ли мы вызвать метод напрямую, зачем нам нужны call() , apply() или bind()?
Может ли кто-нибудь объяснить с точки зрения непрофессионала и немного с точки зрения JavaScript?
Спасибо, @NickParsons. везде объясняется, что такое diff в call() , bind() и apply(), но не возникло вопроса, где упоминается, какова конкретная цель.
Используя call и apply, вы можете заимствовать метод из другого объекта. Обратите внимание, что первым аргументом как call, так и apply является то, каким объектом вы хотите, чтобы его this был. Например, если у вас есть объект employee и другой объект people, и есть метод с именем employee.fullName(), которого нет в people, вы можете сделать employee.fullName.call(people), что будет похоже на вызов people.fullName(), даже если у людей нет метода fullName().



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это гибкость, предлагаемая Javascript, объект и его метод не должны быть связаны друг с другом.
Учитывая следующий объект «a» с методом-членом «play»
var a = { play: function (content) { console.info("what is this:", this, content)} }
Использовать
a.play('Hello')
Эквивалентно
a.play.call(a, 'Hello')
Что касается вашего вопроса, зачем нужен второй способ «вызвать». Потому что «вызов» дает вам возможность вызвать что-то другое вместо «это», которое в приведенном выше примере является «а», поэтому вы можете сделать:
a.play.call(document, 'Hello')
Что касается «применить», это просто еще одна версия «вызова», которая требует, чтобы вы передавали аргументы в виде массива вместо параметров, разделенных запятыми. Чтобы использовать применить, вы делаете:
a.play.apply(a, ['Hello'])
Что касается «привязки», то сначала нужно связать функцию с «этим» объектом, а затем получить возвращаемый вызываемый объект, который вы можете либо вызвать с остальными аргументами напрямую, либо передать его во что-нибудь еще, чтобы вызвать позже.
Типичным вариантом использования «привязки» является обработчик событий компонента React. Чтобы определить обработчик события, который будет передан в компонент. Вам нужно использовать «bind» в компоненте класса React следующим образом:
handleClick = this.handleClick.bind(this)
Затем в функции рендеринга:
<Button onClick = {this.handleClick} />
Проверьте https://reactjs.org/docs/handling-events.html для получения полной информации.
Вау .. большое спасибо @Rob . Я понял полностью.
Чего вы не понимаете из сообщений о переполнении стека, которые вы уже читали? Скорее всего, вы получите подобные объяснения, которым вы не сможете следовать, если не объясните то, чего конкретно не понимаете. Понимание этих методов требует некоторого понимания ключевого слова
this, может быть, это то, за чем вы не следуете? (если это так, вы можете проверить документы для этого)