Search
Write a publication
Pull to refresh

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.

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.