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

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

Жанры

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

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 - функция

return function {

// Сконструировать список аргументов, начиная со второго аргумента

// метода bind, и передать все эти аргументы указанной функции,

var args = [], і;

fог(і = 1; і < boundArgs.length; i++) args.push(boundArgs[i]);

for(i = 0; і < arguments.length; i++) args.push(arguments[i]);

// Теперь вызвать self как метод объекта о со всеми аргументами

return self.apply(о, args);

};

};

}

Обратите внимание, что функция, возвращаемая этим методом

bind,
является замыканием, использующим переменные
self
и
boundArgs,
объявленные во внешней функции, которые остаются доступными вложенной функции даже после того, как она будет возвращена внешней функцией и вызвана из-за пределов внешней функции.

Метод

bind,
определяемый стандартом ECMAScript 5, имеет некоторые особенности, которые невозможно реализовать в ECMAScript 3. Прежде всего, настоящий метод
bind
возвращает объект функции, свойство
length
которой установлено в соответствии с количеством параметров связываемой функции, минус количество связанных аргументов (но не меньше нуля). Во-вторых, метод
bind(
) в ECMAScript 5 может использоваться для частичного применения функций-конструкторов. Если функцию, возвращаемую методом
bind,
использовать как конструктор, значение
this
, переданное методу
bind,
игнорируется, и оригинальная функция будет вызвана как конструктор, с уже связанными аргументами, если они были определены. Функции, возвращаемые методом
bind,
не имеют свойства prototype (свойство prototype обычных функций нельзя удалить), и объекты, созданные связанными функциями-конструкторами, наследуют свойство prototype оригинального, несвязанного конструктора. Кроме того, с точки зрения оператора
instanceof
связанные конструкторы действуют точно так же, как несвязанные конструкторы.

8.7.5. Метод toString

Подобно другим объектам в языке JavaScript, функции имеют метод

toString
. Спецификация ECMAScript требует, чтобы этот метод возвращал строку, следующую синтаксису инструкции объявления функции. На практике большинство (но не все) реализаций метода
toString
возвращают полный исходный текст функции. Для встроенных функций обычно возвращается строка, содержащая вместо тела функции текст «[native code]» или аналогичный.

8.7.6. Конструктор Function

Функции обычно определяются с помощью ключевого слова

function
либо в форме инструкции объявления функции, либо в форме выражения-литерала. Однако функции могут также определяться с помощью конструктора
Function.
Например:

var f = new Function("x", "у", "return x*y;");

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

var f = function(x, у) { return х*у; }

Конструктор

Function
принимает произвольное число строковых аргументов. Последний аргумент должен содержать текст с телом функции; он может включать произвольное число инструкций на языке JavaScript, разделенных точкой с запятой. Все остальные аргументы конструктора интерпретируются как имена параметров функции. Чтобы создать функцию, не имеющую аргументов, достаточно передать конструктору всего одну строку - тело функции.

Примечательно, что конструктору

Function
не передается никаких аргументов, определяющих имя создаваемой функции. Подобно литералам функций, конструктор
Function
создает анонимные функции.

Есть несколько моментов, связанных с конструктором

Function,
о которых следует упомянуть особо:

• Конструктор

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

• При каждом вызове конструктор

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

• И последний, очень важный момент: когда функция создается с помощью конструктора

Function,
не учитывается лексическая область видимости - функции всегда компилируются как глобальные функции, что наглядно демонстрирует следующий фрагмент:

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

Эпоха Опустошителя. Том VII

Павлов Вел
7. Вечное Ристалище
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Эпоха Опустошителя. Том VII

Неверный

Тоцка Тала
Любовные романы:
современные любовные романы
5.50
рейтинг книги
Неверный

Бастард Императора. Том 2

Орлов Андрей Юрьевич
2. Бастард Императора
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бастард Императора. Том 2

Железный Воин Империи II

Зот Бакалавр
2. Железный Воин Империи
Фантастика:
фэнтези
попаданцы
аниме
5.75
рейтинг книги
Железный Воин Империи II

Газлайтер. Том 12

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

Последний Паладин. Том 9

Саваровский Роман
9. Путь Паладина
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Последний Паладин. Том 9

Дочь моего друга

Тоцка Тала
2. Айдаровы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Дочь моего друга

Телохранитель Генсека. Том 3

Алмазный Петр
3. Медведев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Телохранитель Генсека. Том 3

Наномашины, Кошмар Академии! Том 10

Новиков Николай Васильевич
10. Первый среди карапузов
Фантастика:
аниме
попаданцы
5.00
рейтинг книги
Наномашины, Кошмар Академии! Том 10

Матабар

Клеванский Кирилл Сергеевич
1. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар

Этот мир не выдержит меня. Том 2

Майнер Максим
2. Первый простолюдин в Академии
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Этот мир не выдержит меня. Том 2

Ермак. Противостояние. Книга одиннадцатая

Валериев Игорь
11. Ермак
Фантастика:
попаданцы
альтернативная история
4.50
рейтинг книги
Ермак. Противостояние. Книга одиннадцатая

На границе империй. Том 10. Часть 13

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 13

1941, Великая Отечественная катастрофа: Итоги дискуссии

Коллектив авторов
Документальная литература:
военная документалистика
6.25
рейтинг книги
1941, Великая Отечественная катастрофа: Итоги дискуссии