2011-10-19 4 views
13

У меня есть приложение JavaScript, которое использует много обратных вызовов. Типичная функция выполняет обратный вызов и переносит ее с помощью другого обратного вызова.Когда мне следует использовать функцию call() vs, вызывающую функцию напрямую?

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() метод (передавая результат вар в качестве второго аргумента), а не вызывая their_on_success() и переходя в результате с помощью вызова функции?

ответ

19

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

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

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

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

+1

Основной случай для 'apply' - это дело с переменными аргументами, поэтому вы можете просто передать ему аргументы. –

3

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

their_on_success.call(myContext, results) 

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

3

Хорошим примером является реализация функции, которая требует обратного вызова. При написании 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

1

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

+1

Я получаю то, что вы говорите, но я думаю, что его можно улучшить. Что-то вроде: JavaScript позволяет вообще не указывать прототип ('Object.create (null)'), переопределять свойства прототипов собственных объектов или даже самого объекта. Поэтому, чтобы быть в безопасности, нужно использовать 'Object.prototype.hasOwnProperty.call (obj, 'someProp')' для того, чтобы ваш код был пуленепробиваемым. –

Смежные вопросы