Когда я должен использовать call() против прямого вызова функции?
У меня есть приложение JavaScript, которое использует много обратных вызовов. Типичная функция принимает обратный вызов и оборачивает его другим обратным вызовом.
Namespace.foo = function( arg, their_on_success ) {
var my_on_success = function( result ) {
console.log( 'my_on_success() called' );
if( 'function' === typeof their_on_success ) {
their_on_success( result );
}
}
something( arg, my_on_success );
};
Учитывая приведенный выше пример, когда такая установка должна использовать родную call()
метод (передавая результат var в качестве второго аргумента), а не вызывая their_on_success()
и передать результат через вызов функции?
6 ответов
call() используется для изменения значения this в функции:
var obj = {a: 0};
method.call(obj, "parameter");
function method(para) {
this.a == 0; // true <-- obj is now this
}
Единственная причина использовать call
(или же apply
), если вы хотите установить значение this
внутри функции.
Ну, я думаю apply
может быть полезен в других случаях, так как принимает массив параметров.
Использование функции call()
Метод позволяет изменить объект, который связан с функцией как this
во время выполнения функции - это также называется контекстом
their_on_success.call(myContext, results)
Но, если ваша функция обратного вызова не зависит от this
, не имеет значения, как вы это называете.
Хорошим примером является реализация функции, которая требует обратного вызова. При написании ОО-кода вы хотите разрешить вызывающей стороне указывать контекст, по которому будет вызываться обратный вызов.
function validateFormAjax(form, callback, context) {
// Using jQuery for simplicity
$.ajax({
url: '/validateForm.php',
data: getFormData(form),
success: function(data) {
callback.call(context, data);
}
});
}
Обратите внимание, что мой пример может быть реализован путем передачи параметра context в $.ajax
позвоните, но это не показало бы вам много об использовании call
Другой случай использования call() - это ситуация, когда вы не можете доверять тому, что собственный метод объекта не был заменен, или вы знаете, что на самом деле у него нет метода, который вы хотите запустить на нем. hasOwnProperty часто является таким методом - есть много мест, где у объектов javascript может не быть своего собственного метода hasOwnProperty, поэтому вызывать его как hasOwnProperty.call(obj, propertyName) разумно.
Один из сценариев, который я часто использую "call" - это аргументы сплайсинга:
const fn = function() {
const args = Array.prototype.slice.call(arguments, 0);
console.log(args);
}
Обратите внимание, что аргументы - это объект. Арги, однако, является массивом.