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

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

Жанры

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
замещаются глобальным объектом, а простое значение - соответствующим объектом-оберткой.

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

Кино

Делёз Жиль
Документальная литература:
публицистика
4.00
рейтинг книги
Кино

Врата Мертвого Дома

Эриксон Стивен
Малазанская империя
Фантастика:
эпическая фантастика
6.14
рейтинг книги
Врата Мертвого Дома

Перерождение: Монстр

Kanekiru Kogitsune
Фантастика:
фэнтези
рпг
попаданцы
7.97
рейтинг книги
Перерождение: Монстр

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

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

Кодекс Охотника. Книга XIV

Винокуров Юрий
14. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XIV

Да, мой лорд

МамаЛена
Фантастика:
фэнтези
5.00
рейтинг книги
Да, мой лорд

Люди, годы, жизнь

Эренбург Илья Григорьевич
Мой 20 век
Документальная литература:
биографии и мемуары
6.00
рейтинг книги
Люди, годы, жизнь

Чужак

Листратов Валерий
1. Ушедший Род
Фантастика:
попаданцы
аниме
фэнтези
5.25
рейтинг книги
Чужак

Мост через вечность

Бах Ричард Дэвис
Научно-образовательная:
философия
8.19
рейтинг книги
Мост через вечность

Серебряный пояс

Топилин Владимир Степанович
Приключения:
исторические приключения
5.00
рейтинг книги
Серебряный пояс

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

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

Последний Исход

Петрук Вера
4. Сага о халруджи
Фантастика:
фэнтези
боевая фантастика
5.40
рейтинг книги
Последний Исход

Огонь

Сокол Лена
Любовные романы:
5.00
рейтинг книги
Огонь

Имперец. Том 3

Романов Михаил Яковлевич
2. Имперец
Фантастика:
боевая фантастика
попаданцы
альтернативная история
7.50
рейтинг книги
Имперец. Том 3