Применение методов apply и call

Методы функции apply и call принимают параметры:
this для вызова функции и аргументы функции и совершают вызов функции с данным this c данными аргументами.

Во втором параметре кроется различие между методами: apply аргументы принимает в виде массива, а call в виде списка аргументов.

Когда нам могут понадобиться эти методы? Ниже несколько примеров:

Например, нужно вызвать какой-нибудь удобный метод массива не для массива. В примере ниже мы работаем с объектом arguments как с массивом:

function getFirstArgument(){
    return Array.prototype.slice.apply(arguments, [0,1]);
}
getFirstArgument(1,2,3); //1

Array.prototype можно заменить на [], т.е. получить slice так

[].slice

Бывает удобно использовать Math.max для определения максимального элемента массива.
Но вот незадача Math.max в качестве аргументов принимает числа. Тут на помощь приходит apply:

var arr = [5,90,4, 3];
Math.max(arr); 
//NaN, так как массив к числу преобразовать не получается
Math.max.apply(null, arr); //90

В качестве this спокойно передаем null, так как this в данном методе не используется.

А вот другой пример, где this крайне важно, а аргументы не нужны:

function draw(){
    console.log(this.name + ' draws')}
}

var Igor = {
   name: 'Игорь'
}
draw.call(Igor);

Если мы вызовем draw(), то в консоли выведется только draws, так как this в данном случае [object Window], у которого нет свойства name.Если же действие происходит в строгом режиме, то this будет равно undefined.

Хотите быть в курсе новых статей?