Подтвердить что ты не робот

Когда следует использовать функцию call() vs для непосредственного вызова функции?

У меня есть приложение 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() и передать результат посредством вызова функции?

4b9b3361

Ответ 1

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

var obj = {a: 0};
method.call(obj, "parameter");
function method(para) {
    this.a == 0; // true <-- obj is now this
}

Ответ 2

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

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

Ответ 3

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

their_on_success.call(myContext, results)

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

Ответ 4

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

function validateFormAjax(form, callback, context) {
  // Using jQuery for simplicity
  $.ajax({
    url: '/validateForm.php',
    data: getFormData(form),
    success: function(data) {
      callback.call(context, data);
    }
  });
}

Обратите внимание, что мой пример может быть просто реализован путем передачи параметра контекста вызову $.ajax, но это не показало бы вам многого о том, как использовать call

Ответ 5

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