Продвинутая работа с функциями Flashcards
Что такое рекурсия?
Рекурсия — это вызов функцией самой себя.
Как работает функция возведения в степень с помощью рекурсии?
Функция проверяет, если n равно 1, то возвращает x, иначе умножает x на результат вызова этой же функции с аргументами x и n-1.
Как работает функция возведения в степень с помощью цикла?
Функция использует цикл, чтобы умножить x на самого себя n раз, после чего возвращает результат.
Почему рекурсивные задачи обычно короче, чем итеративные?
Рекурсивные задачи обычно короче, потому что они могут использовать вызов функции самой себя, что позволяет избежать дублирования кода и сделать код более читаемым.
Что такое глубина рекурсии?
Глубина рекурсии - это общее количество вложенных вызовов (включая первый).
Что такое стек контекстов выполнения?
Стек контекстов выполнения - это структура данных, в которой сохраняются контексты выполнения функций при их вложенных вызовах, чтобы позднее можно было вернуться к выполнению этих функций.
Что происходит, когда функция производит вложенный вызов?
Выполнение текущей функции приостанавливается, контекст выполнения, связанный с ней, запоминается в стеке контекстов выполнения, затем выполняются вложенные вызовы, для каждого из которых создаётся свой контекст выполнения. После завершения вложенных вызовов старый контекст достаётся из стека, и выполнение внешней функции возобновляется с того места, где она была остановлена.
Что такое связанный список?
Связанный список - это рекурсивная структура данных, состоящая из узлов, каждый из которых содержит значение и указатель на следующий узел.
Какая основная разница между массивом и связанным списком?
У элементов массива есть индексы, в то время как у элементов связанного списка их нет. Вставка и удаление элементов в начало массива медленны, в то время как в связанном списке эти операции производятся за константную сложность.
Что такое HEAD и TAIL в связанном списке?
HEAD — это начало связанного списка, а TAIL - это его конец.
Как добавить новый элемент в начало связанного списка?
Нужно создать новый элемент со значением и указателем на предыдущий HEAD, а затем переопределить HEAD, чтобы он указывал на новый элемент.
Как удалить элемент из середины связанного списка?
Нужно перенаправить указатель “next” удаляемого узла к следующему элементу в списке.
Какие типы связанных списков существуют?
Существуют односвязный список, двусвязный список и кольцевой связанный список.
В чем отличие двусвязного списка от односвязного списка?
В отличие от односвязного списка, узел двусвязного списка имеет две ссылки: на следующий и на предыдущий узел, что позволяет манипулировать списком с обоих концов.
Как осуществляется добавление элемента в двусвязный список?
Чтобы добавить элемент в двусвязный список, нужно создать новый узел с заданным значением, установить ссылку на следующий узел в новом узле на тот, на который должен быть вставлен новый узел, и ссылку на предыдущий узел - на тот, на который указывал предыдущий узел вставляемого узла.
Как осуществляется удаление элемента из двусвязного списка?
Чтобы удалить элемент из двусвязного списка, нужно сначала определить узел, который предшествует удаляемому узлу, и установить ссылку на следующий узел в найденном узле на тот, который следует за удаляемым узлом. Также нужно обновить ссылку на предыдущий узел в следующем узле, чтобы она указывала на узел, предшествующий удаляемому узлу.
Что происходит, если в функцию передать больше параметров, чем она принимает?
Лишние параметры не вызовут ошибки.
Что делает rest-оператор в функции?
Rest-оператор собирает все оставшиеся параметры функции и помещает их в массив.
Где должен располагаться rest-оператор в функции?
Rest-оператор должен всегда располагаться в конце.
Что такое переменная arguments?
Переменная arguments - это псевдомассив, в котором хранятся все аргументы, переданные в функцию.
Можно ли передать только часть аргументов в переменную arguments?
Нет, переменная arguments содержит все аргументы, переданные в функцию.
Можно ли использовать объект arguments в стрелочных функциях?
Нет, стрелочные функции не имеют переменной arguments.
Что делает spread-оператор?
Spread-оператор “раскрывает” итерируемый объект.
Что произойдет при использовании spread-оператора с массивом при вызове функции Math.max()?
Spread-оператор “раскроет” массив в список аргументов функции Math.max().
Можно ли комбинировать spread-оператор с обычными значениями?
Да, можно комбинировать spread-оператор с обычными значениями.
Для чего можно использовать Array.from?
Array.from можно использовать, если необходимо “раскрыть” и итерируемый объект и псевдомассив.
Что такое замыкание в JavaScript?
Замыкание - это функция, которая запоминает свои внешние переменные и может получить к ним доступ. В JavaScript все функции являются замыканиями, кроме случая, когда функция создается с использованием new Function.
Что такое лексическое окружение в JavaScript?
Лексическое окружение - это внутренний (скрытый) объект, который есть у каждой выполняемой функции, блока кода и скрипта. Объект лексического окружения состоит из двух частей: Environment Record - объект, в котором хранятся все локальные переменные, и ссылка на внешнее лексическое окружение - на код, который снаружи текущих фигурных скобок.
Что такое Environment Record в лексическом окружении?
Environment Record — это объект, в котором хранятся все локальные переменные (а также некоторая другая информация, такая как this). Переменная — это свойство объекта лексического окружения, где ключ - название переменной.
Как функция запоминает, в каком лексическом окружении она была создана?
С помощью скрытого свойства [[Environment]] – ссылки, которая указывает на текущее лексическое окружение.
Какие две части составляют объект лексического окружения в JavaScript?
Объект лексического окружения состоит из двух частей: Environment Record и ссылки на внешнее лексическое окружение.
Что означает глобальное лексическое окружение в JavaScript?
Глобальное лексическое окружение в JavaScript связано со всем скриптом и содержит информацию о глобальных переменных, функциях и других объектах, доступных на уровне всего скрипта.
Какое состояние имеет лексическое окружение в начале скрипта?
Пустое.
Что происходит при объявлении переменной в лексическом окружении?
Создается запись в объекте лексического окружения для данной переменной.
Какое значение получает переменная в лексическом окружении при объявлении без присваивания?
undefined.
Что происходит с лексическим окружением при присваивании значения переменной?
Значение переменной обновляется в лексическом окружении.
Что на самом деле представляют переменные в JavaScript?
Переменные представляют свойства объекта лексического окружения.
Как работает поиск переменных в лексическом окружении функции?
При поиске переменных в лексическом окружении функции, сначала происходит поиск в текущем лексическом окружении, затем во внешнем, и так далее, до глобального лексического окружения, благодаря ссылке на внешнее лексическое окружение. Если переменная не найдена, в strict mode будет ошибка, а без strict mode будет создана глобальная переменная с таким именем.
Какое значение получает функция при доступе к переменной?
Функция получает текущее значение переменной, то есть последнее значение.
Что происходит при создании функции Function Declaration?
Название функции Function Declaration инициализируется в лексическом окружении при создании лексического окружения, а не тогда, когда выполнение доходит до нее. Поэтому можно вызвать Function Declaration до того, как она объявлена.
Какие возможности есть для вложенных функций в JavaScript?
Вложенная функция может быть свойством объекта (методом функции-конструктора) или возвращаться как значением в другой функции.
Что происходит при вызове функции в JavaScript?
При каждом вызове функции создается новое лексическое окружение.
Можно ли получить доступ к внешней переменной из вложенной функции?
Да, вложенная функция может получить доступ к переменным во внешнем лексическом окружении.
Можно ли получить доступ к внутренним переменным из внешнего лексического окружения?
Нет, внешнее лексическое окружение не имеет ссылок на внутренние переменные вложенных функций.
Что происходит с лексическим окружением при выполнении блока if?
При выполнении блока if создается лексическое окружение, которое имеет ссылку на внешнее, что дает доступ к внешним переменным. Все переменные, объявленные внутри блока if, остаются в его лексическом окружении и не видны снаружи, включая функции внутри блока if.
Какие переменные принадлежат лексическому окружению блока for?
Если переменная объявлена внутри скобок блока for с использованием let, то эта переменная принадлежит его лексическому окружению.
Как можно использовать блоки кода для изоляции переменных в локальной области видимости?
Можно использовать блоки кода { … } для изоляции переменных в локальной области видимости, чтобы избежать конфликтов с другими скриптами. В таком блоке переменные, объявленные с помощью let или const, будут видны только внутри блока, а снаружи его - не будут.
Что такое IIFE?
IIFE — это сокращение от immediately-invoked function expression, что означает моментально вызываемое функциональное выражение.
В данный момент в IIFE нет необходимости, так как современные версии JS поддерживают лексическое окружение на уровне блоков кода с помощью ключевых слов “let” и “const”.
Зачем программисты придумали IIFE?
IIFE было придумано для того, чтобы функцию можно было создать и сразу вызвать “на месте”. Раньше в JavaScript не было лексического окружения на уровне блоков кода, поэтому IIFE позволял создавать локальную область видимости и избежать конфликтов имен.
Как создать IIFE?
Для создания IIFE нужно создать Function Expression и сразу вызвать ее. Function Expression оборачивается в скобки, чтобы JavaScript не принимал его за Function Declaration. Есть несколько способов создания IIFE, например, обернуть функцию в круглые скобки, перед функцией поставить оператор ! или +, либо использовать функциональное выражение с вызовом в конце, заключенное в круглые скобки.
Что происходит с лексическим окружением функции после её выполнения?
Лексическое окружение очищается и удаляется после того, как функция выполнилась, если на него не ссылается ни одна другая функция. Если есть вложенные функции, которые всё ещё доступны после выполнения внешней функции, то лексическое окружение сохраняется в памяти, пока они не будут удалены.
Когда объект лексического окружения умирает?
Объект лексического окружения умирает, когда становится недоступным, т.е. когда на него не ссылается ни одна функция.
Какие движки JS пытаются оптимизировать сохранение внешних переменных при жизни функции?
V8 (Chromium).
Что происходит с внешней переменной, если движок JS анализирует использование переменных и находит, что она не используется?
Она удаляется.
Какие побочные эффекты возникают при использовании отладчика в V8?
Переменные, которые были удалены при оптимизации, становятся недоступными при отладке.
Может ли внешняя переменная сохраниться при оптимизации движком JS, даже если она не используется в коде?
Да, если по коду не ясно, что она не используется.
Какое ключевое слово в JavaScript является устаревшим способом объявления переменных?
Ключевое слово “var”.
Чем ограничивается область видимости переменных, объявленных с помощью “var”?
Только функцией или скриптом (глобальной областью видимости).
Какой тип области видимости был у блоков на заре развития JavaScript?
На заре развития JavaScript блоки не имели лексической области видимости.