Метод call позволяет указать объект, на который будет ссылаться this во время вызова Функции.

Метод call применяется к функции, в параметре получает объект. При этом функция выполняется, и внутри нее this становится равным переданному объекту. Помимо контекста, в параметры можно передать необходимые параметры функции.

См. также this (рекомендуется до прочтения статьи), apply, bind.

Синтаксис

функция.call(контекст, параметр1, параметр2, ..., параметр n);

Примеры

Пример

Вызовем метод sayHi объекта user, в контексте объекта user2 (у которого нет такого метода):

var user = {
	name: 'Андрей',
	sayHi: function() 
	{
		alert('Привет. Меня зовут ' + this.name);
	}
}

var user2 = {
	name: 'Вася',
}
user.sayHi.call(user2); //Привет. Меня зовут Андрей

В этом примере мы вызвали метод user.sayHi в контексте user2, то есть фактически написали: user2.sayHi(), но при этом в user2 такого метода нет. Это и есть предназначение call. Во время вызова метода, вместо того, что бы вызывать его, мы вызываем метод call, который вызовет функцию, и установит this равным переданному контексту.

Пример

Метод call кроме контекста может получать и параметры для функции:

var user = {
	name: 'Андрей',
	sayHi: function(yourName) {
		alert('Привет ' + yourName + '. Меня зовут ' + this.name);
	}
}

var user2 = {
	name: 'Вася',
}

var name = prompt('Ваше имя?', '');
user.sayHi.call(user2, name);

Здесь мы фактически написали user2.sayHi('Коля');

Результат выполнения кода:

Пример

Для псевдомассива arguments выполним метод массива join:

function printArgs() {
	var str = [].join.call(arguments);
	document.wtite(str);
}

printArgs(1,2,3,4,5);

С помощью '[].join' мы получили добрались до функции массива, которую затем вызвали в контексте arguments

Результат выполнения кода:

1, 2, 3, 4, 5

Пример

Но в предыдущем примере мы лишь вызвали метод массива для псевдомассива. Если понадобится еще раз его вызвать, то придется писать тоже самое. Но это не эффективно. Давайте сделаем из псевдомассива обычный массив. Для этого воспользуемся методом slice:

function printSortArgs() {
	var args = [].slice.call(arguments);
	args.sort(function(a, b) {
		return a - b;
	});
	document.write( args.join(', ') );
}

printSortArgs(5, 6, 4, 7, 0, 1);

В этом примере мы скопировали элементы псевдомассива arguments в массив args. А затем без проблем выполнили 2 метода массива: sort, и join.

Результат выполнения кода:

0, 1, 4, 5, 6, 7