Когда я должен использовать call () против прямого вызова функции? - PullRequest
14 голосов
/ 19 октября 2011

У меня есть приложение 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 ]

19 голосов
/ 19 октября 2011

call () используется для изменения значения this функции:

var obj = {a: 0};
method.call(obj, "parameter");
function method(para) {
    this.a == 0; // true <-- obj is now this
}
7 голосов
/ 19 октября 2011

Единственная причина использовать call (или apply), если вы хотите установить значение this внутри функции.

Ну, я думаю, apply может быть полезным в других случаях, так как он принимает массив параметров.

3 голосов
/ 19 октября 2011

Хорошим примером является реализация функции, которая требует обратного вызова. При написании ОО-кода вы хотите разрешить вызывающей стороне указывать контекст, по которому будет вызываться обратный вызов.

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

3 голосов
/ 19 октября 2011

Использование метода call() позволяет вам изменять объект, связанный с функцией, как this во время выполнения функции - это также называется context

their_on_success.call(myContext, results)

Но если ваша функция обратного вызова не зависит от this, то не имеет значения, каким образом вы ее вызываете.

1 голос
/ 09 февраля 2017

Другой случай использования call () - это ситуация, когда вы не можете доверять тому, что собственный метод объекта не был заменен, или вы знаете, что на самом деле у него нет метода, который вы хотите запустить на нем.hasOwnProperty часто является таким методом - есть много мест, где у объектов javascript может не быть своего собственного метода hasOwnProperty, поэтому вызывать его как hasOwnProperty.call (obj, propertyName) разумно.

0 голосов
/ 28 августа 2018

Один сценарий, который я часто использую "call", - это сплайс аргументов:

const fn = function() {
    const args = Array.prototype.slice.call(arguments, 0);
    console.log(args);
}

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

...