Продвинутая работа с функциями Flashcards
Какие есть свойства у функции ? Для чего может использоваться свойство length ?
length,name. Свойство length иногда используется для интроспекций в функциях, которые работают с другими функциями.
Что такое Named Function Expression ? Какие особенности у NFE ? Какую проблему это решает ?
NFE – это термин для Function Expression, у которого есть имя.
Есть две важные особенности имени func, ради которого оно даётся:
Оно позволяет функции ссылаться на себя же.
Оно не доступно за пределами функции.
Можно ли сделать NFE с function declaration
NO
Синтаксис new Function. Какая особенность окружения у такой функции ?
let func = new Function ([arg1, arg2, …argN], functionBody);
Функции, объявленные через new Function, имеют [[Environment]], ссылающийся на глобальное лексическое окружение, а не на родительское. Поэтому они не могут использовать внешние локальные переменные
Какие два метода планирования существуют ? В чем их отличие ?
Синтаксис для создания методов
Для этого существуют два метода:
setTimeout позволяет вызвать функцию один раз через определённый интервал времени.
setInterval позволяет вызывать функцию регулярно, повторяя вызов через определённый интервал времени.
let timerId = setTimeout(func|code, [delay], [arg1], [arg2], …);
Сборка мусора и колбэк setTimeout/setInterval
Когда функция передаётся в setInterval/setTimeout, на неё создаётся внутренняя ссылка и сохраняется в планировщике. Это предотвращает попадание функции в сборщик мусора, даже если на неё нет других ссылок.
// функция остаётся в памяти до тех пор, пока планировщик обращается к ней
setTimeout(function() {…}, 100);
Для setInterval функция остаётся в памяти до тех пор, пока не будет вызван clearInterval.
Есть и побочный эффект. Функция ссылается на внешнее лексическое окружение, поэтому пока она существует, внешние переменные существуют тоже. Они могут занимать больше памяти, чем сама функция. Поэтому, если регулярный вызов функции больше не нужен, то лучше отменить его, даже если функция очень маленькая.
Что лучше использовать для точной задержки по времени ?
Вложенный SetTimeout
Перечислите флаги свойств объекта и за что они отвечают ?
Помимо значения value, свойства объекта имеют три специальных атрибута (так называемые «флаги»).
writable – если true, свойство можно изменить, иначе оно только для чтения.
enumerable – если true, свойство перечисляется в циклах, в противном случае циклы его игнорируют.
configurable – если true, свойство можно удалить, а эти атрибуты можно изменять, иначе этого делать нельзя.
Какой Метод позволяет получить полную информацию о свойстве ?
Метод Object.getOwnPropertyDescriptor позволяет получить полную информацию о свойстве.
Каким методом можно изменить флаги ? Как он работает если свойства нет ?
Object.defineProperty(obj, propertyName, descriptor)
Если свойство существует, defineProperty обновит его флаги. В противном случае метод создаёт новое свойство с указанным значением и флагами; если какой-либо флаг не указан явно, ему присваивается значение false.
Что делает Флаг неконфигурируемого свойства (configurable:false) ? Пример такого флага
Неконфигурируемое свойство не может быть удалено, его атрибуты не могут быть изменены.
Например, свойство Math.PI – только для чтения, неперечислимое и неконфигурируемое:
Определение свойства как неконфигурируемого – это дорога в один конец. Мы не можем изменить его обратно с помощью defineProperty.
Обратите внимание: configurable: false не даст изменить флаги свойства, а также не даст его удалить. При этом можно изменить значение свойства.
Какие два вида свойств у объекта существуют ?
Первый тип это свойства-данные (data properties). Мы уже знаем, как работать с ними. Все свойства, которые мы использовали до текущего момента, были свойствами-данными.
Второй тип свойств мы ещё не рассматривали. Это свойства-аксессоры (accessor properties). По своей сути это функции, которые используются для присвоения и получения значения, но во внешнем коде они выглядят как обычные свойства объекта.
Чем представляются свойства- аксеcсоры ? Синтаксис методов? Когда срабатывают эти методы ? Как они вызываются ?
Свойства-аксессоры представлены методами: «геттер» – для чтения и «сеттер» – для записи. При литеральном объявлении объекта они обозначаются get и set
Чем отличаются дескрипторы свойств аксессоров ?
Свойства-аксессоры не имеют value и writable, но взамен предлагают функции get и set.
То есть, дескриптор аксессора может иметь:
get – функция без аргументов, которая сработает при чтении свойства,
set – функция, принимающая один аргумент, вызываемая при присвоении свойства,
enumerable – то же самое, что и для свойств-данных,
configurable – то же самое, что и для свойств-данных.