JavaScript — очень красивый и изящный язык. И для того чтобы хорошо владеть им мало просто знать синтаксис, надо также понимать некоторые тонкости работы движка, а также применять красивые синтаксические конструкции.
И так, меньше слов, больше дела, поехали.
Для того чтобы понять принципы работы методов call() и apply() разберем пример, в котором требуется найти минимальное и максимальное значения элементов массива.
У нас есть массив, в котором определенное число элементов. Первое решение которое приходит в голову — цикл, проходим массив от и до и так далее.
Но есть более красивый вариант:
Для решения используем встроенные в JavaScript функции Math.min() и Math.max(). Вызываем Math.min() через apply(), таким образом мы изменяем контекст этой функции на наш объект (в данном случае этим объектом является массив).
Для изменения контекста функции в JavaScript предусмотрены два метода call() и apply(). Эти методы автоматически становятся доступными после того как функция инициализирована. Они практически идентичны, но есть небольшие отличия. Кстати, контекст обозначет то, на какой объект ссылается оператор this в функции, внутри которой он вызван.
Рассмотрим пример:
А теперь пробуем изменить контекст функции:
Метод call делает абсолютно тоже самое, единственным отличием является передача остальных параметров для функции. Разницу можно легко понять разобрав этот пример:
Наглядная разница между call и apply.

По рисунку можно легко понять, какой параметр соответствует какому именно аргументу.
И так, мы смогли разобрать очень подробно принцип работы этих двух методов. Изменение контекста очень важный прием в JavaScript и широко применяется в различных библиотеках, например для обработки событий.
Для проверки примеров рекомендую Вам использовать FireBug.
Подобного рода приемы и синтаксические конструкции очень детально и понятно разбираются в книге Джона Резига под названием Secrets of the JavaScript Ninja.
И так, меньше слов, больше дела, поехали.
Для того чтобы понять принципы работы методов call() и apply() разберем пример, в котором требуется найти минимальное и максимальное значения элементов массива.
У нас есть массив, в котором определенное число элементов. Первое решение которое приходит в голову — цикл, проходим массив от и до и так далее.
Но есть более красивый вариант:
var a = [ 0, 1, 2, 3 ];
var smallest = function( array ) {
return Math.min.apply( Math, array );
}
var largest = function( array ) {
return Math.max.apply( Math, array );
}
smallest( a ); // Мы получим 0
largest( a ); // А здесь 3
Для решения используем встроенные в JavaScript функции Math.min() и Math.max(). Вызываем Math.min() через apply(), таким образом мы изменяем контекст этой функции на наш объект (в данном случае этим объектом является массив).
Для изменения контекста функции в JavaScript предусмотрены два метода call() и apply(). Эти методы автоматически становятся доступными после того как функция инициализирована. Они практически идентичны, но есть небольшие отличия. Кстати, контекст обозначет то, на какой объект ссылается оператор this в функции, внутри которой он вызван.
Рассмотрим пример:
var context = function() {
console.log( this ); // Мы получим глобальный объект "Window"
}
context();
А теперь пробуем изменить контекст функции:
var obj = { prop: 1 };
var context = function() {
console.log( this ); // Мы получим наш объект "Object { prop=1 }"
}
context.apply( obj );
Метод call делает абсолютно тоже самое, единственным отличием является передача остальных параметров для функции. Разницу можно легко понять разобрав этот пример:
var add = function( a, b ) {
return a + b;
}
add( 1, 2 ); // Обычный вызов
add.call( this, 1, 2 ); // call принимает каждый аргумент индивидуально и меняет контекст
add.apply( this, [ 1, 2 ] ); // apply принимает массив аргументов также меняя контекст
Наглядная разница между call и apply.

По рисунку можно легко понять, какой параметр соответствует какому именно аргументу.
И так, мы смогли разобрать очень подробно принцип работы этих двух методов. Изменение контекста очень важный прием в JavaScript и широко применяется в различных библиотеках, например для обработки событий.
Для проверки примеров рекомендую Вам использовать FireBug.
Подобного рода приемы и синтаксические конструкции очень детально и понятно разбираются в книге Джона Резига под названием Secrets of the JavaScript Ninja.