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);
Поделиться:
Популярные книги
Антология странного рассказа
Проза:
современная проза
5.00
рейтинг книги
Товарищ "Чума" 6
6. Товарищ "Чума"
Фантастика:
городское фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Отверженный III: Вызов
3. Отверженный
Фантастика:
фэнтези
альтернативная история
7.73
рейтинг книги
Мельницы богов
Детективы:
прочие детективы
9.22
рейтинг книги
Железный Воин Империи II
2. Железный Воин Империи
Фантастика:
фэнтези
попаданцы
аниме
5.75
рейтинг книги
Законник Российской Империи. Том 2
2. Словом и делом
Фантастика:
городское фэнтези
альтернативная история
аниме
дорама
6.40
рейтинг книги
Последний Герой. Том 2
2. Последний герой
Фантастика:
попаданцы
альтернативная история
4.50
рейтинг книги
Вперед в прошлое 3
3. Вперёд в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Газлайтер. Том 39
39. История Телепата
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
попаданцы
5.00
рейтинг книги
Наследник старого рода
1. Живой лёд
Фантастика:
фэнтези
8.19
рейтинг книги
Мужчина не моей мечты
1. Мужчина не моей мечты
Любовные романы:
любовно-фантастические романы
8.30
рейтинг книги
Ведун
1. Второй шанс
Фантастика:
фэнтези
боевая фантастика
альтернативная история
5.00
рейтинг книги
Ну привет, заучка...
Любовные романы:
эро литература
короткие любовные романы
8.30
рейтинг книги
Кодекс Крови. Книга VII
7. РОС: Кодекс Крови
Фантастика:
боевая фантастика
попаданцы
аниме
5.00