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»).
Метод 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);
succ(2) // => 3: аргумент x связан со значением 1, а 2 передается в арг. у
function f(y.z) { return this.x + у + z }; // Еще одна функция сложения
var g = f.bind({x:1}, 2); // Связать this и у
g(3) // => 6: this.x - связан с 1, у - связан с 2, а 3 передается в z
В ECMAScript 3 также возможно связывать значение this
и выполнять частичное применение. Стандартный метод bind()
можно имитировать программным кодом, который приводится в примере 8.5. Обратите внимание, что этот метод сохраняется как Function.prototype.bind
, благодаря чему все функции наследуют его. Данный прием подробно рассматривается в разделе 9.4.
Пример 8.5. Метод Function.bind() для ECMAScript 3
if (!Function.prototype.bind) {
Function.prototype.bind = function(o /*, аргументы */) {
// Сохранить this и arguments в переменных, чтобы их можно было
// использовать во вложенной функции ниже,
var self = this, boundArgs = arguments;
// Возвращаемое значение метода bind() - функция
Читать дальше
Конец ознакомительного отрывка
Купить книгу