Являются ли обратные вызовы в JavaScript просто пустыми функциями?
Обратные вызовы - это не просто пустые функции. Это функции, которые можно вызвать (часто с некоторыми аргументами) через некоторое время. Иногда они являются необязательными, и функция хоста позволит вам пройти обратный вызов или не передать обратный вызов. Если обратный вызов не передан, функция хоста может обнаружить, что он не передан в качестве аргумента и соответствующим образом адаптирует его поведение.
Что означает следующее утверждение?
callback = callback || function() {};
Означает ли это, что обратные вызовы - это просто пустые функции?
Это общий шаблон дизайна, чтобы гарантировать, что аргумент функции имеет значимое значение в случае, если он не был передан вызывающим поэтому функция может протекать внутри и выполнять, как правило, предполагая, что аргумент был принят абонентом , даже если вызывающий не прошел аргумент.
Код callback = callback || function() {};
эквивалентно следующему:
if (callback) {
callback = callback;
} else {
callback = function() {};
}
В JavaScript, оператор ||
присваивает результат будет первым из двух операндов, что является truthy (или false
, если ни один не truthy), так что если callback
имеет значение, то оно становится результатом операнда ||
, и вы получаете callback = callback
. В противном случае, если callback
не является правдивым, он присваивает callback
значение функции по умолчанию, которое позволяет остальной функции работать, предполагая, что callback
имеет законное значение. Это заставляет все остальные функциональные коды проверять, имеет ли значение callback
законное значение перед его использованием.
Кроме того, в чем разница между callback.call(this)
и callback(anything)
?
someFunction.call()
позволяет значению this
при выполнении функции. Таким образом, callback.call(this)
делает обратный вызов равным this
, когда он работает, что делает текущая функция. Если вы только что сделали callback(...)
без .call()
, то this
возьмет на себя значение по умолчанию, которое будет либо объектом window
, либо, если работает в строгом режиме, оно будет undefined
.
Если конкретный обратный вызов не происходит, чтобы обратиться к значению this
в его коде, то не будет никакой разницы в результатах с помощью .call()
или не использовать его, но в этом случае, это дополнительная функция, предлагается к обратному вызову, что он может получить доступ к текущему экземпляру объекта Store
, который используется при доступе к значению this
внутри обратного вызова.
Установка значения this
как это позволяет использовать метод объекта как прямой обратный вызов, так что это то же самое, что соглашение о вызове методы объекта есть.
Так что, если у вас есть Store
объект вроде этого:
var s = new Store();
И был метод этого объекта под названием setName()
, который использует this
для обозначения своего собственного экземпляра объекта, вы можете сделать:
s.findAll(s.setName);
Это будет работать только потому, что callback.call(this)
установил значение экземпляра в значение this
в обратном вызове.
ES5 совсем не «устарел», поскольку почти все Javascript, предназначенные для запуска в браузере, все еще должны быть совместимы с ES5. Выберите другую фразу для использования. Кроме того, вы подробно рассказываете о местах, которые этот шаблон проектирования может вызвать проблемы, но это не имеет отношения к случаю использования OP, который передает функцию, которая не может быть законно ложной. – jfriend00
@ jfriend00 Даже без ES6 этот шаблон падает, когда вы работаете с чем-либо, кроме объектов. Поскольку существуют лучшие шаблоны ES5, и ES6 предоставил правильное решение (которое теперь можно использовать с помощью транспилеров), это, безусловно, устарело. – ssube
Шаблон работает отлично для функции (в чем заключается этот вопрос) или для любого аргумента, который не имеет законного значения ложности. Нет ничего «устаревшего» об использовании его в коде OP. – jfriend00