Ответ 1
Почему требуется привязка JavaScript()?
Значение this
определяется тем, как вызывается функция. Если вы вызываете эту функцию, обычно нет необходимости использовать .bind
, так как у вас есть контроль над вызовом функции и, следовательно, ее значение this
.
Однако часто вы не вызываете эту функцию. Функции передаются другим функциям как обратные вызовы и обработчики событий. Они вызываются другим кодом, и вы не можете контролировать, как вызывается функция, и поэтому не можете управлять тем, что будет ссылаться на this
.
Если для вашей функции требуется this
для установки определенного значения, и вы не являетесь тем, кто вызывает эту функцию, вам нужно .bind
использовать функцию для определенного значения this
.
Другими словами: .bind
позволяет вам установить значение this
, не вызывая теперь функцию.
Вот сравнение ссылок на/вызывающие функции:
+-------------------+-------------------+
| | |
| time of | time of |
|function execution | this binding |
| | |
+-------------------+-------------------+-------------------+
| | | |
| function object | future | future |
| f | | |
| | | |
+-------------------+-------------------+-------------------+
| | | |
| function call | now | now |
| f() | | |
| | | |
+-------------------+-------------------+-------------------+
| | | |
| f.call() | now | now |
| f.apply() | | |
| | | |
+-------------------+-------------------+-------------------+
| | | |
| f.bind() | future | now |
| | | |
+-------------------+-------------------+-------------------+
Мне также интересно, почему пример 3 решает проблему и разницу между примерами 2 и 3.
Пример 1/2 и 3 не могут быть более разными. storeMyName
и storeMyName2
содержат функции, которые вызываются в будущем, тогда как storeMyName3
содержит результат вызова myName.getName()
в этот момент.
Дополнительный материал для чтения: