при вызове функции у нее есть скрытый аргумент
arguments
тоесть
function myfunc() {
alert( arguments ); // тут массив переданных аргументов
}
myfunc( arg1, arg2 );
при вызове myfunc обычным образом ей передается в качестве контекста то что стоит слева от метода, в нашем случаем:
myfunc();
не имеет ничего слева и по умолчанию функция получает контекст
window в обычном режиме или
null в строгом режиме.
тоесть:
function myfunc() {
alert( this ); // window в обычном режиме, null в строгом режиме
}
И что бы функция получила нужный нам контекст, для этого есть два метода, особо сильно они не отличаются, например вызвать функцию и передать ей нужный контекст можно так:
myfunc.call( "Я новый контекст", arg1, arg2 );
и при вызове мы получим:
function myfunc() {
alert( this ); // "Я новый контекст"
alert( arguments ); // массив аргументов
}
другой метод apply отличается тем что в него не нужно передавать аргументы списком, а достаточно передать массив аргументов:
myfunc.apply( "Я новый контекст", [ arg1, arg2 ] );
и при вызове мы получим тоже самое:
function myfunc() {
alert( this ); // "Я новый контекст"
alert( arguments ); // массив аргументов
}
тоесть apply нам дает возможность вызвать функцию не зная точного количества аргументов, допустим мы перехватываем нашу функцию
myfunc но мы не знаем сколько в нее аргументов должно придти
function proxyMyfunc() {
// делаем нужное действие
// и вызываем оригинал
myfunc.apply( this, arguments );
}