Необходимость методов call(), apply() и bind()

Я прочитал много теории о call(), apply() и bind().

Я не могу понять, можем ли мы вызвать метод напрямую, зачем нам нужны call() , apply() или bind()?

Может ли кто-нибудь объяснить с точки зрения непрофессионала и немного с точки зрения JavaScript?

Чего вы не понимаете из сообщений о переполнении стека, которые вы уже читали? Скорее всего, вы получите подобные объяснения, которым вы не сможете следовать, если не объясните то, чего конкретно не понимаете. Понимание этих методов требует некоторого понимания ключевого слова this, может быть, это то, за чем вы не следуете? (если это так, вы можете проверить документы для этого)

Nick Parsons 19.11.2022 14:22

Спасибо, @NickParsons. везде объясняется, что такое diff в call() , bind() и apply(), но не возникло вопроса, где упоминается, какова конкретная цель.

Rashmi Sharma 19.11.2022 14:27

Используя call и apply, вы можете заимствовать метод из другого объекта. Обратите внимание, что первым аргументом как call, так и apply является то, каким объектом вы хотите, чтобы его this был. Например, если у вас есть объект employee и другой объект people, и есть метод с именем employee.fullName(), которого нет в people, вы можете сделать employee.fullName.call(people), что будет похоже на вызов people.fullName(), даже если у людей нет метода fullName().

slebetman 19.11.2022 15:57
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это гибкость, предлагаемая 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 . Я понял полностью.

Rashmi Sharma 19.11.2022 16:50

Другие вопросы по теме