try {
if (b === 0) {
throw newError('Division by zero');
}
return a / b;
} catch (error) {
console.error('Error:', error.message);
}
}
console.log(divide(10, 2)); // Выведет: 5
console.log(divide(10, 0)); // Выведет: "Error: Division by zero"
11. Что такое hoisting в JavaScript? Как это работает с переменными и функциями?
Hoisting в JavaScript – это механизм, при котором переменные и функции "поднимаются" вверх своей области видимости перед тем, как код начнет выполняться. Это означает, что переменные могут быть объявлены после их использования, а функции могут быть вызваны до их объявления. Однако только объявления переменных и функций поднимаются, а присвоения значений остаются на своих местах.
console.log(myVar); // Выведет: undefined
let myVar = 10;
12. Чем отличается синхронный код от асинхронного? Какие могут быть преимущества использования асинхронного кода?
Синхронный код выполняется последовательно, один шаг за другим, в то время как асинхронный код позволяет выполнить некоторые операции параллельно или отложить их выполнение, продолжая выполнение кода. Преимущества асинхронного кода включают повышение производительности за счет параллельного выполнения операций и предотвращение блокировки потока выполнения, что позволяет приложению быть более отзывчивым.
13. Что такое Event Loop в JavaScript? Как он влияет на выполнение асинхронного кода?
Event Loop (Цикл событий) – это механизм в JavaScript, который контролирует порядок выполнения кода. Он следит за стеком вызовов и очередью колбэков, перемещая колбэки из очереди в стек при завершении синхронного кода. Это позволяет асинхронному коду выполняться после завершения синхронных операций, не блокируя основной поток выполнения.
14. Какие основные принципы функционального программирования можно использовать в JavaScript?
Принципы функционального программирования в JavaScript включают использование функций высшего порядка, чистых функций, неизменяемости данных и функций map, filter и reduce для обработки данных. Эти концепции помогают создавать более чистый, модульный и легко поддерживаемый код.
Рассмотрим каждый из этих принципов более детально:
1) Функции первого класса (First-Class Functions). В JavaScript функции являются объектами первого класса, что означает, что их можно присваивать переменным, передавать как аргументы, возвращать из других функций.
const greet = function (name) {
return `Hello, ${name}!`;
};
const sayHello = greet;
console.log(sayHello("John")); // Output: Hello, John!
2) Чистые функции (Pure Functions). Чистая функция возвращает результат, основываясь только на своих аргументах, не имеет побочных эффектов и не зависит от глобального состояния.
function add(a, b) {
return a + b;
}
console.log(add(2, 3)); // Output: 5
3) Неизменяемость (Immutability). Изменение состояния может привести к ошибкам и сложностям в отладке. В функциональном программировании ценится неизменяемость данных, и вместо изменения существующих данных создаются новые.
const numbers = [1, 2, 3];
const newNumbers = […numbers, 4]; // создание нового массива с добавлением элемента
console.log(newNumbers); // Output: [1, 2, 3, 4]
4) Функции высшего порядка (Higher-Order Functions). Это функции, которые принимают другие функции в качестве аргументов или возвращают их. Они позволяют абстрагировать операции и создавать более гибкий и читаемый код.
const multiplyBy = function (factor) {
return function (number) {
return number * factor;
};
};
const double = multiplyBy(2);
console.log(double(5)); // Output: 10
5) Рекурсия. Вместо циклов используется рекурсия для выполнения повторяющихся задач. Рекурсивные функции вызывают сами себя с изменяющимися аргументами.
function factorial(n) {
return n === 0 ? 1 : n * factorial(n – 1);
}
console.log(factorial(5)); // Output: 120