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

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

Жанры

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

Кроме того, при создании замыканий следует помнить, что

this
– это ключевое слово, а не переменная. Как отмечалось выше, каждый вызов функции получает свое значение
this
, и замыкание не имеет доступа к значению
this
внешней функции, если внешняя функция не сохранит его в переменной:

var self = this; // Сохранить значение this в переменной для использования

// во вложенной функции.

То же относится и к объекту

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

var outerArguments = arguments; // Сохранить для использования во вложенных функциях

В примере 8.5, далее в этой главе, определяется замыкание, использующее эти приемы для получения доступа к значениям

this
и
arguments
внешней функции.

8.7. Свойства и методы функций и конструктор Function

Мы видели, что в JavaScript-программах функции могут использоваться как значения. Оператор

typeOf
возвращает для функций строку «function», однако в действительности функции в языке JavaScript - это особого рода объекты. А раз функции являются объектами, то они имеют свойства и методы, как любые другие объекты. Существует даже конструктор
Function,
который создает новые объекты функций. В следующих подразделах описываются свойства и методы функций, а также конструктор
Function.
Кроме того, информация обо всем этом приводится в справочном разделе.

8.7.1. Свойство length

В теле функции свойство

arguments.length
определяет количество аргументов, переданных функции. Однако свойство
length
самой функции имеет иной смысл. Это свойство, доступное только для чтения, возвращает количество аргументов, которое функция ожидает получить, - число объявленных параметров.

В следующем фрагменте определяется функция с именем

check,
получающая массив аргументов
arguments
от другой функции. Она сравнивает свойство
arguments.length
(число фактически переданных аргументов) со свойством
arguments. callee.length
(число ожидаемых аргументов), чтобы определить, передано ли функции столько аргументов, сколько она ожидает. Если значения не совпадают, генерируется исключение. За функцией
check
следует тестовая функция
f
, демонстрирующая порядок использования функции
check:

// Эта функция использует arguments.callee, поэтому она

// не будет работать в строгом режиме,

function check(args) {

var actual = args.length; // Фактическое число аргументов

var expected = args.callee.length; // Ожидаемое число аргументов

if (actual !== expected) // Если не совпадают, генерируется исключение

throw new Еrror("ожидается: " + expected + получено " + actual);

}

function f(x, у, z) {

// Проверить число ожидаемых и фактически переданных аргументов.

check(arguments);

// Теперь выполнить оставшуюся часть функции как обычно

return х + у + z;

}

8.7.2. Свойство prototype

Любая функция имеет свойство prototype, ссылающееся на объект, известный как объект прототипа. Каждая функция имеет свой объект прототипа. Когда функция используется в роли конструктора, вновь созданный объект наследует свойства этого объекта прототипа. Прототипы и свойство prototype обсуждались в разделе 6.1.3, и мы еще раз вернемся к этим понятиям в главе 9.

8.7.3. Методы call и apply

Методы

саll
и
аррlу
позволяют выполнять косвенный вызов функции (раздел 8.2.4), как если бы она была методом некоторого другого объекта. (Мы уже использовали метод
саll
в примере 6.4 для вызова
Object.prototype.toString
относительно объекта, класс которого необходимо было определить.) Первым аргументом обоим методам,
саll
и
аррlу,
передается объект, относительно которого вызывается функция; этот аргумент определяет контекст вызова и становится значением ключевого слова
this
в теле функции. Чтобы вызвать функцию
f
(без аргументов) как метод объекта о, можно использовать любой из методов,
саll
или
аррlу:

f.call(о);

f.apply(o);

Любой из этих способов вызова эквивалентен следующему фрагменту (где предполагается, что объект о не имеет свойства с именем m):

о.m = f; // Временно сделать f методом о.

о.m; // Вызывать его без аргументов,

delete о.m; // Удалить временный метод.

В строгом режиме ECMAScript 5 первый аргумент методов

саll
и
apply
становится значением
this
, даже если это простое значение,
null
или
undefined
. В ECMAScript 3 и в нестрогом режиме значения
null
и
undefined
замещаются глобальным объектом, а простое значение - соответствующим объектом-оберткой.

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

Отряд

Валериев Игорь
5. Ермак
Фантастика:
альтернативная история
5.25
рейтинг книги
Отряд

Ты - наша

Зайцева Мария
1. Наша
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Ты - наша

Сержант. Назад в СССР. Книга 4

Гаусс Максим
4. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Сержант. Назад в СССР. Книга 4

Солдат Империи

Земляной Андрей Борисович
1. Страж
Фантастика:
попаданцы
альтернативная история
6.67
рейтинг книги
Солдат Империи

Падение Софии (русский роман)

Хаецкая Елена Владимировна
Фантастика:
фэнтези
5.00
рейтинг книги
Падение Софии (русский роман)

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

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Лекарь Империи 5

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

Неучтенный элемент. Том 12

NikL
12. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 12

Выйду замуж за спасателя

Рам Янка
1. Спасатели
Любовные романы:
современные любовные романы
7.00
рейтинг книги
Выйду замуж за спасателя

Женщины

Буковски Чарльз
Проза:
современная проза
6.90
рейтинг книги
Женщины

Сильнейший Столп Империи. Книга 5

Ермоленков Алексей
5. Сильнейший Столп Империи
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Сильнейший Столп Империи. Книга 5

Я спас СССР! том 1

Вязовский Алексей
1. Я спас СССР
Фантастика:
альтернативная история
6.57
рейтинг книги
Я спас СССР! том 1

Афганский рубеж

Дорин Михаил
1. Рубеж
Фантастика:
попаданцы
альтернативная история
7.50
рейтинг книги
Афганский рубеж

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

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