Когда я должен использовать 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);
}

Обратите внимание, что аргументы - это объект. Арги, однако, является массивом.

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