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

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

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

Синтаксис

функция.apply(контекст, массив параметров);

Примеры

Пример

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

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

var user2 = {
	name: 'Вася',
}
user.sayHi.apply(user2);

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

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

Пример

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

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

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

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

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

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

Пример

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

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

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

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

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

1, 2, 3, 4, 5

Пример

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

function printSortArgs() {
	var args = [].slice.apply(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