Как стать автором
Обновить

JavaScript — методы call и apply

JavaScript — очень красивый и изящный язык. И для того чтобы хорошо владеть им мало просто знать синтаксис, надо также понимать некоторые тонкости работы движка, а также применять красивые синтаксические конструкции.

И так, меньше слов, больше дела, поехали.

Для того чтобы понять принципы работы методов 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.

image

По рисунку можно легко понять, какой параметр соответствует какому именно аргументу.

И так, мы смогли разобрать очень подробно принцип работы этих двух методов. Изменение контекста очень важный прием в JavaScript и широко применяется в различных библиотеках, например для обработки событий.

Для проверки примеров рекомендую Вам использовать FireBug.

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

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.