Чтение онлайн

на главную - закладки

Жанры

JavaScript. Подробное руководство, 6-е издание
Шрифт:

Все остальные аргументы метода

саll,
следующие за первым аргументом, определяющим контекст вызова, передаются вызываемой функции. Например, ниже показано, как можно передать функции
f
два числа и вызвать ее, как если бы она была методом объекта о:

f.call(o, 1, 2);

Метод

аррlу
действует подобно методу
саll,
за исключением того, что аргументы для функции передаются в виде массива:

f.apply(o, [1,2]);

Если функция способна обрабатывать произвольное число аргументов, метод

apply
может использоваться для вызова такой функции в контексте массива произвольной длины. Например, чтобы отыскать наибольшее число в массиве чисел, для передачи элементов массива функции
Math.max
можно было бы использовать метод
ар ply :

var biggest = Math.max.apply(Math, array_of_numbers);

Обратите внимание, что метод

apply
может работать не только с настоящими массивами, но и с объектами, подобными массивам. В частности, вы можете вызвать функцию с теми же аргументами, что и текущую функцию, передав массив с аргументами непосредственно методу
аррlу.
Этот прием демонстрируется ниже:

// Замещает метод m объекта о версией метода, которая регистрирует

// сообщения до и после вызова оригинального метода.

function trace(o, m) {

var original = o[m]; // Сохранить оригинальный метод в замыкании.

o[m] = function { // Определить новый метод.

console.log(new Date, "Entering:", m); // Записать сообщение,

var result = original.apply(this, arguments): // Вызвать оригинал,

console.log(new Date, "Exiting:", m); // Записать сообщение,

return result: // Вернуть результат.

};

}

Эта функция

trace
принимает объект и имя метода. Она замещает указанный метод новым методом, который «обертывает» оригинальный метод дополнительной функциональностью. Такой прием динамического изменения существующих методов иногда называется «обезьяньей заплатой» («monkey-patching»).

8.7.4. Метод bind

Метод

bind
впервые появился в ECMAScript 5, но его легко имитировать в ЕСМА-Script 3. Как следует из его имени, основное назначение метода
bind
состоит в том, чтобы связать (bind) функцию с объектом. Если вызвать метод
bind
функции f и передать ему объект о, он вернет новую функцию. Вызов новой функции (как обычной функции) выполнит вызов оригинальной функции f как метода объекта о. Любые аргументы, переданные новой функции, будут переданы оригинальной функции. Например:

function f(у) { return this.x + у: } // Функция, которую требуется привязать

var о = { х : 1 }; // Объект, к которому выполняется привязка

var g = f.bind(o); // Вызов g(х) вызовет o.f(x)

g(2) // => 3

Такой способ связывания легко реализовать в ECMAScript 3, как показано ниже:

// Возвращает функцию, которая вызывает f как метод объекта о

// и передает ей все свои аргументы,

function bind(f, о) {

if (f.bind) return f.bind(o): // Использовать метод bind, если имеется

else return function { // Иначе связать, как показано ниже

return f.apply(o, arguments):

};

}

Метод

bind
в ECMAScript 5 не просто связывает функцию с объектом. Он также выполняет частичное применение: помимо значения
this
связаны будут все аргументы, переданные методу
bind
после первого его аргумента. Частичное применение - распространенный прием в функциональном программировании и иногда называется каррингом (currying). Ниже приводится несколько примеров использования метода
bind
для частичного применения:

var sum = function(x,у) { return х + у }; // Возвращает сумму 2 аргументов

// Создать новую функцию, подобную sum, но со связанным значением null

// ключевого слова this и со связанным значением первого аргумента, равным 1.

// Новая функция принимает всего один аргумент,

var succ = sum.bind(null, 1);

Поделиться:
Популярные книги

Гвардия. (Дилогия)

Мусаниф Сергей Сергеевич
65. В одном томе
Фантастика:
научная фантастика
8.57
рейтинг книги
Гвардия. (Дилогия)

Остаться в живых

Сорока Ирина
1. Призрачная Академия
Фантастика:
фэнтези
7.95
рейтинг книги
Остаться в живых

Егерь. Столичный гамбит

Скиба Николай
4. Зверолов
Фантастика:
рпг
уся
фэнтези
фантастика: прочее
попаданцы
6.67
рейтинг книги
Егерь. Столичный гамбит

Сфабрикованный Иисус

Эванс Крейг
Религия. Настоящее христианство
Документальная литература:
критика
5.00
рейтинг книги
Сфабрикованный Иисус

Из истории русской, советской и постсоветской цензуры

Рейфман Павел Семенович
Научно-образовательная:
история
5.00
рейтинг книги
Из истории русской, советской и постсоветской цензуры

An ordinary sex life

Астердис
Любовные романы:
современные любовные романы
love action
5.00
рейтинг книги
An ordinary sex life

Что нас не убивает

Абвов Алексей Сергеевич
Фантастика:
фэнтези
киберпанк
рпг
8.71
рейтинг книги
Что нас не убивает

#Бояръ-Аниме. Газлайтер. Том 11

Володин Григорий Григорьевич
11. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 11

Король Ардена

Анри Софи
Фантастика:
фэнтези
5.00
рейтинг книги
Король Ардена

История кавалерии. Вооружение, тактика, крупнейшие сражения

Денисон Джордж Тэйлор
Научно-образовательная:
история
cпецслужбы
военная история
5.00
рейтинг книги
История кавалерии. Вооружение, тактика, крупнейшие сражения

Советская республика и капиталистический мир. Часть I. Первоначальный период организации сил

Троцкий Лев Давидович
Документальная литература:
публицистика
5.00
рейтинг книги
Советская республика и капиталистический мир. Часть I. Первоначальный период организации сил

Сага о копье: Омнибус. Том II

Коллектив авторов
Сага о Копье
Фантастика:
фэнтези
5.00
рейтинг книги
Сага о копье: Омнибус. Том II

Вода в доме и на участке

Гальперина Галина Анатольевна
3. Домашний мастер
Дом и Семья:
прочее домоводство
6.25
рейтинг книги
Вода в доме и на участке

H2o

Дубинянская Яна
Фантастика:
социально-философская фантастика
5.00
рейтинг книги
H2o