Ответ 1
call() используется для изменения этого значения функции:
var obj = {a: 0};
method.call(obj, "parameter");
function method(para) {
this.a == 0; // true <-- obj is now this
}
У меня есть приложение 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()
и передать результат посредством вызова функции?
call() используется для изменения этого значения функции:
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
, не имеет значения, как вы ее называете.
Хорошим примером является реализация функции, которая требует обратного вызова. При написании 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
Другой случай использования call() - это когда вы находитесь в среде, где вы не можете доверять, что собственный метод объекта не был заменен, или вы знаете, что на самом деле у него нет метода, который вы хотите запустить на нем. hasOwnProperty часто является таким методом - существует много мест, где объекты javascript могут не иметь свой собственный метод hasOwnProperty, поэтому его вызывать как hasOwnProperty.call(obj, propertyName) является разумным.