Применение методов 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.