🎯 TOMORROW: HACKATHON DAY 🚀
💻 All in. Full power.
🔥 No excuses, just results.
🏆 Our mission: 1st place.
⚡ Let’s code, create & conquer together!
💻 All in. Full power.
🔥 No excuses, just results.
🏆 Our mission: 1st place.
⚡ Let’s code, create & conquer together!
⚡2🔥1💯1🆒1
🧐 Что делает и для чего нужна функци function.Prototype.Bind?
🛑Основные возможности `bind()`
Привязывает
Позволяет создавать частично примененные функции
Используется в обработчиках событий и таймерах
Пример: потеря
bind() – это метод, который создает новую функцию с привязанным контекстом (this) и (опционально) фиксированными аргументами. 🛑Основные возможности `bind()`
Привязывает
this, чтобы не потерять контекст Позволяет создавать частично примененные функции
Используется в обработчиках событий и таймерах
Пример: потеря
this без bind() const user = {
name: "Иван",
sayHello() {
console.log(`Привет, ${this.name}!`);
},
};
setTimeout(user.sayHello, 1000); // ❌ this = undefined⚡2🔥1🆒1
Дебаунс событий для плавного интерфейса!
Частые события
Проблемный код:
Проблема: при быстром
Улучшенный дебаунсер:
Применяем с
🔥 В следующей части рассмотрим почему для scroll дебаунс не работает и как throttle решает эту проблему для плавных анимаций!
Частые события
resize или input могут перегружать страницу и тормозить анимации. Решение — дебаунс с правильными опциями.Проблемный код:
window.addEventListener('resize', () => {
console.log('Width:', window.innerWidth);
updateLayout();
});Проблема: при быстром
resize — десятки вызовов в секунду.Улучшенный дебаунсер:
function debounce(fn, delay = 200) {
let timer;
return (...args) => {
clearTimeout(timer);
timer = setTimeout(() => fn(...args), delay);
};
}Применяем с
cleanup:const debouncedResize = debounce(() => {
console.log('Debounced width:', window.innerWidth);
}, 300);
window.addEventListener('resize', debouncedResize);🔥 В следующей части рассмотрим почему для scroll дебаунс не работает и как throttle решает эту проблему для плавных анимаций!
⚡1🔥1
⚠️ XSS-атака (Cross-Site Scripting) в JavaScript
Что это такое?
XSS-атака позволяет злоумышленнику внедрить вредоносный JavaScript-код на сайт. Это может привести к краже данных пользователей, изменению интерфейса сайта или даже захвату аккаунтов.
❌ Как выглядит уязвимость?
Пример кода, уязвимого к XSS:
💀 Что тут не так?
Если в поле ввести:
то этот код выполнится на сайте!
✅ Как защититься от XSS?
🔹 Экранируй ввод пользователя – удаляй или заменяй специальные символы.
🔹 Используй textContent вместо innerHTML:
🔹 Применяй Content Security Policy (CSP) – ограничивай выполнение скриптов.
Это только один вид атак. Если интересно, могу рассказать про SQL-инъекции, CSRF или MITM. Пиши в комменты! 🚀
Что это такое?
XSS-атака позволяет злоумышленнику внедрить вредоносный JavaScript-код на сайт. Это может привести к краже данных пользователей, изменению интерфейса сайта или даже захвату аккаунтов.
❌ Как выглядит уязвимость?
Пример кода, уязвимого к XSS:
<form>
<input type="text" id="name" placeholder="Введите имя">
<button onclick="submitForm()">Отправить</button>
</form>
<p id="output"></p>
<script>
function submitForm() {
let name = document.getElementById("name").value;
document.getElementById("output").innerHTML = "Привет, " + name;
}
</script>
💀 Что тут не так?
Если в поле ввести:
<script>alert("Взлом!");</script>то этот код выполнится на сайте!
✅ Как защититься от XSS?
🔹 Экранируй ввод пользователя – удаляй или заменяй специальные символы.
🔹 Используй textContent вместо innerHTML:
document.getElementById("output").textContent = "Привет, " + name;🔹 Применяй Content Security Policy (CSP) – ограничивай выполнение скриптов.
Это только один вид атак. Если интересно, могу рассказать про SQL-инъекции, CSRF или MITM. Пиши в комменты! 🚀
⚡1🔥1💯1🆒1
🧐 В чём отличие null от undefined?
null в JavaScript — это явное указание на отсутствие значения или объекта, тогда как undefined означает, что переменная или свойство были объявлены, но не инициализированы. null назначается вручную разработчиком, а undefined — результат автоматического присваивания переменным, которые ещё не получили значения. В логическом контексте оба значения считаются ложными, но их использование отличается в зависимости от смысла кода. null чаще используется для инициализации переменных, ожидающих объект.
🔥3⚡1💯1
🧐 Что такое dispatch?
В контексте Frontend-разработки,
🛑`dispatch` в Redux
В Redux
🛑`dispatchEvent` в JavaScript (EventTarget API)
В нативном JavaScript метод
🛑`dispatch` в React (useReducer)
В React-хуке
В контексте Frontend-разработки,
dispatch — это метод, который отправляет (диспатчит) событие или действие. В зависимости от технологии dispatch может использоваться в Redux, EventTarget или React. 🛑`dispatch` в Redux
В Redux
dispatch(action) используется для отправки (диспатча) действий (actions) в хранилище (store). import { useDispatch } from 'react-redux';
const Counter = () => {
const dispatch = useDispatch();
return (
<button onClick={() => dispatch({ type: 'INCREMENT' })}>
Увеличить
</button>
);
};🛑`dispatchEvent` в JavaScript (EventTarget API)
В нативном JavaScript метод
dispatchEvent() используется для генерации пользовательских событий на DOM-элементах. const button = document.querySelector("button");
// Создаём событие
const event = new Event("myCustomEvent");
// Добавляем слушатель событий
button.addEventListener("myCustomEvent", () => {
console.log("Событие вызвано!");
});
// Диспатчим событие
button.dispatchEvent(event); // Выведет: "Событие вызвано!"🛑`dispatch` в React (useReducer)
В React-хуке
useReducer dispatch используется для изменения состояния компонента. import { useReducer } from 'react';
const reducer = (state, action) => {
switch (action.type) {
case 'increment':
return { count: state.count + 1 };
default:
return state;
}
};
const Counter = () => {
const [state, dispatch] = useReducer(reducer, { count: 0 });
return (
<button onClick={() => dispatch({ type: 'increment' })}>
{state.count}
</button>
);
};💯2🔥1
🧐 Чем отличается замыкание от области видимости?
Замыкание и область видимости — это два фундаментальных концепта в JavaScript, связанных с работой переменных, но они решают разные задачи. Давайте разберёмся в их отличиях.
🛑 Область видимости (Scope)
Область видимости определяет, где в коде можно обращаться к переменной. В JavaScript есть три основные области видимости:
Глобальная область видимости – переменные доступны в любом месте кода.
Область видимости функции (функциональная) – переменные доступны только внутри функции, где они были объявлены.
Блочная область видимости (с
🛑 Замыкание (Closure)
Замыкание – это функция, которая запоминает область видимости, в которой была создана, даже после выхода из неё. То есть, если внутренняя функция использует переменные внешней функции, она "захватывает" их и может использовать даже после завершения работы внешней функции.
Замыкание и область видимости — это два фундаментальных концепта в JavaScript, связанных с работой переменных, но они решают разные задачи. Давайте разберёмся в их отличиях.
🛑 Область видимости (Scope)
Область видимости определяет, где в коде можно обращаться к переменной. В JavaScript есть три основные области видимости:
Глобальная область видимости – переменные доступны в любом месте кода.
Область видимости функции (функциональная) – переменные доступны только внутри функции, где они были объявлены.
Блочная область видимости (с
let и const) – переменные доступны только внутри блока {}. function testScope() {
let x = 10; // x доступна только внутри testScope
console.log(x); // 10
}
console.log(x); // Ошибка: x не определена🛑 Замыкание (Closure)
Замыкание – это функция, которая запоминает область видимости, в которой была создана, даже после выхода из неё. То есть, если внутренняя функция использует переменные внешней функции, она "захватывает" их и может использовать даже после завершения работы внешней функции.
function outer() {
let count = 0;
return function inner() {
count++;
console.log(count);
};
}
const counter = outer(); // outer выполняется, но переменная count остается в памяти
counter(); // 1
counter(); // 2
counter(); // 3⚡1🔥1💯1🆒1
🧐 Как бы добавлял статический метод в prototype?
На самом деле, статические методы не добавляются в
Но если ты хочешь имитировать статический метод в
🛑Как работают статические методы? (`static`)
В классе статические методы объявляются с помощью
🛑Добавление "статического" метода в `prototype` (не совсем статический)
Если нужно, чтобы каждый объект имел доступ к "статическому" методу через
🛑Добавление метода напрямую в сам класс (имитация `static`)
Если хочется добавить метод на сам класс, а не в
На самом деле, статические методы не добавляются в
prototype, потому что они принадлежат самому классу, а не его экземплярам. Но если ты хочешь имитировать статический метод в
prototype, можно использовать функцию-конструктор и добавить метод вручную. 🛑Как работают статические методы? (`static`)
В классе статические методы объявляются с помощью
static. Они не находятся в prototype, а принадлежат самому классу. class User {
static sayHello() {
return "Привет!";
}
}
console.log(User.sayHello()); // ✅ "Привет!"
console.log(User.prototype.sayHello); // ❌ undefined (нет в prototype)🛑Добавление "статического" метода в `prototype` (не совсем статический)
Если нужно, чтобы каждый объект имел доступ к "статическому" методу через
prototype, можно сделать такfunction User(name) {
this.name = name;
}
// Добавляем метод в prototype
User.prototype.sayHello = function () {
return "Привет!";
};
const user1 = new User("Иван");
console.log(user1.sayHello()); // ✅ "Привет!"🛑Добавление метода напрямую в сам класс (имитация `static`)
Если хочется добавить метод на сам класс, а не в
prototype, можно сделать такfunction User(name) {
this.name = name;
}
// Добавляем метод прямо в функцию-конструктор
User.sayHello = function () {
return "Привет!";
};
console.log(User.sayHello()); // ✅ "Привет!"⚡1🔥1💯1🆒1
🧐Зачем нужен nginx?
Nginx — это мощный веб-сервер, который используется для раздачи статических файлов, балансировки нагрузки, проксирования запросов и обеспечения безопасности.
🛑Как Nginx раздаёт фронтенд-приложение?
Когда мы билдим SPA-приложение (например, React/Vue/Angular), в папке
🛑Как Nginx проксирует запросы к бэкенду?
Если фронтенд (
🛑Как Nginx балансирует нагрузку?
Если у нас несколько бэкенд-серверов, Nginx может распределять нагрузку между ними.
🛑Как Nginx ускоряет сайт с кэшем?
Кэширование уменьшает нагрузку на сервер и ускоряет загрузку страниц.
Nginx — это мощный веб-сервер, который используется для раздачи статических файлов, балансировки нагрузки, проксирования запросов и обеспечения безопасности.
🛑Как Nginx раздаёт фронтенд-приложение?
Когда мы билдим SPA-приложение (например, React/Vue/Angular), в папке
dist появляются статические файлы (index.html, app.js, styles.css). server {
listen 80;
server_name myapp.com;
root /var/www/myapp/dist;
index index.html;
location / {
try_files $uri /index.html;
}
}🛑Как Nginx проксирует запросы к бэкенду?
Если фронтенд (
myapp.com) и бэкенд (api.myapp.com) находятся на разных серверах, Nginx может перенаправлять запросы на API. server {
listen 80;
server_name myapp.com;
root /var/www/myapp/dist;
index index.html;
location / {
try_files $uri /index.html;
}
# Проксирование API-запросов
location /api/ {
proxy_pass http://localhost:5000/; # Node.js, Python, PHP и т. д.
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}🛑Как Nginx балансирует нагрузку?
Если у нас несколько бэкенд-серверов, Nginx может распределять нагрузку между ними.
upstream backend {
server backend1.myapp.com;
server backend2.myapp.com;
}
server {
listen 80;
server_name api.myapp.com;
location / {
proxy_pass http://backend;
}
}🛑Как Nginx ускоряет сайт с кэшем?
Кэширование уменьшает нагрузку на сервер и ускоряет загрузку страниц.
location /static/ {
expires 7d; # Кэшировать файлы на 7 дней
add_header Cache-Control "public, max-age=604800";
}🔥2💯1🆒1
🧐Что такое псевдоэлемент?
Это специальный синтаксис, позволяющий стилизовать определенные части элемента или добавлять специальные элементы (как бы "элементы-призраки"), не создавая для этого дополнительные теги в HTML. Псевдоэлементы предоставляют удобный способ внесения изменений в структуру документа, не затрагивая HTML.
🛑Синтаксис
Начинается с двойного двоеточия (
🛑Распространенные псевдоэлементы
🛑Особенности работы
Работают как часть документа, но на самом деле не существуют в DOM-дереве, а создаются стилями.
Чтобы псевдоэлементы
Могут быть стилизованы почти так же, как обычные элементы, но есть некоторые ограничения, например, связанные с взаимодействием с JavaScript.
📚 Базу знаний
Это специальный синтаксис, позволяющий стилизовать определенные части элемента или добавлять специальные элементы (как бы "элементы-призраки"), не создавая для этого дополнительные теги в HTML. Псевдоэлементы предоставляют удобный способ внесения изменений в структуру документа, не затрагивая HTML.
🛑Синтаксис
Начинается с двойного двоеточия (
::), за которым следует название псевдоэлемента. Например, ::before или ::after.🛑Распространенные псевдоэлементы
::before и ::after: Позволяют вставлять содержимое до или после содержимого выбранного элемента соответственно. Очень часто используются для добавления декоративных элементов. p::before {
content: "«";
color: blue;
}
p::after {
content: "»";
color: blue;
}
::first-line: Применяет стили к первой строке текста в блочном элементе. p::first-line {
font-weight: bold;
}
::first-letter: Применяет стили к первой букве текста в блочном элементе. p::first-letter {
font-size: 200%;
}
::selection: Применяет стили к части текста, которую пользователь выделил. p::selection {
background: yellow;
}
🛑Особенности работы
Работают как часть документа, но на самом деле не существуют в DOM-дереве, а создаются стилями.
Чтобы псевдоэлементы
::before и ::after отображались, необходимо задать свойство content, даже если оно пустое (content: "";).Могут быть стилизованы почти так же, как обычные элементы, но есть некоторые ограничения, например, связанные с взаимодействием с JavaScript.
📚 Базу знаний
Telegram
Frontend | Вопросы собесов
👾 1429 вопросов собесов на Frontend Developer
🔒 База реальных собесов
🔒 База тестовых заданий
👾 Список менторов
🖥 Frontend
├ Вакансии
├ LeetCode ответы
└ Тесты
🖥 Тестировщик
├ Вопросы собесов
├ Вакансии
└ Тесты
🖥 Python
├ Вопросы собесов
├ Вакансии…
🔒 База реальных собесов
🔒 База тестовых заданий
👾 Список менторов
🖥 Frontend
├ Вакансии
├ LeetCode ответы
└ Тесты
🖥 Тестировщик
├ Вопросы собесов
├ Вакансии
└ Тесты
🖥 Python
├ Вопросы собесов
├ Вакансии…
🔥2⚡1💯1
🧐Что такое миксины в препроцессорах?
Миксины в препроцессорах CSS, таких как Sass, LESS и Stylus, представляют собой переиспользуемые блоки кода, которые можно вставлять в другие блоки стилей. Они позволяют группировать наборы стилей, которые можно повторно использовать по всему CSS-файлу. Это помогает уменьшить дублирование кода и упростить его поддержку.
🛑Примеры использования миксинов
🛑Определение миксина
🛑Использование миксина
🛑Пример на LESS
🛑Определение миксина
🛑Использование миксина
🛑Пример на Stylus
🛑Определение миксина
🛑Использование миксина
Миксины в препроцессорах CSS, таких как Sass, LESS и Stylus, представляют собой переиспользуемые блоки кода, которые можно вставлять в другие блоки стилей. Они позволяют группировать наборы стилей, которые можно повторно использовать по всему CSS-файлу. Это помогает уменьшить дублирование кода и упростить его поддержку.
🛑Примеры использования миксинов
🛑Определение миксина
@mixin border-radius($radius) {
-webkit-border-radius: $radius;
-moz-border-radius: $radius;
border-radius: $radius;
} 🛑Использование миксина
.box {
@include border-radius(10px);
}
.button {
@include border-radius(5px);
} 🛑Пример на LESS
🛑Определение миксина
.border-radius(@radius) {
-webkit-border-radius: @radius;
-moz-border-radius: @radius;
border-radius: @radius;
}🛑Использование миксина
.box {
.border-radius(10px);
}
.button {
.border-radius(5px);
}🛑Пример на Stylus
🛑Определение миксина
border-radius(radius)
-webkit-border-radius: radius
-moz-border-radius: radius
border-radius: radius
🛑Использование миксина
.box
border-radius(10px)
.button
border-radius(5px
🔥2⚡1💯1
"Hi, I’m Bakhromov Abror — welcome to my portfolio. Built with HTML, Tailwind, JavaScript, React, and Redux to showcase my projects and skills." newww
https://bakhromovvrez.onrender.com
https://bakhromovvrez.onrender.com
💯3🔥2🆒2⚡1
🧐 Что такое screen reader и accessibility?
Screen reader — это программа, которая озвучивает содержимое экрана для людей с нарушениями зрения.
Accessibility (доступность) — это практика разработки интерфейсов, которые доступны всем пользователям, включая людей с ограниченными возможностями. Это включает ARIA-атрибуты, контрастность, навигацию с клавиатуры и семантику.
Screen reader — это программа, которая озвучивает содержимое экрана для людей с нарушениями зрения.
Accessibility (доступность) — это практика разработки интерфейсов, которые доступны всем пользователям, включая людей с ограниченными возможностями. Это включает ARIA-атрибуты, контрастность, навигацию с клавиатуры и семантику.
🔥2🆒2⚡1💯1
🧐 Особенности работы с function expression и function declaration?
- Function declaration: создаётся при фазе инициализации, доступна до объявления;
- Function expression: создаётся во время выполнения, не доступна до строки объявления;
- У выражения можно создавать анонимные функции или присваивать переменным.
- Function declaration: создаётся при фазе инициализации, доступна до объявления;
- Function expression: создаётся во время выполнения, не доступна до строки объявления;
- У выражения можно создавать анонимные функции или присваивать переменным.
⚡3🔥1🆒1
🤔 Что такое псевдоклассы?
Это ключевые слова, добавляемые к селекторам, которые указывают на специальное состояние выбранного элемента. Псевдоклассы позволяют стилизовать элементы на основе их состояния в документе, без необходимости добавления дополнительных классов или ID напрямую в HTML-код. С их помощью можно, например, изменить внешний вид ссылок при наведении курсора, стилизовать четные и нечетные элементы списка, изменять стиль элементов при получении фокуса и многое другое.
🚩Зачем нужны псевдоклассы?
Они делают CSS более мощным и гибким, позволяя разработчикам применять стили к элементам на основе их состояния или положения в документе, без изменения HTML-структуры. Это особенно полезно для создания интерактивных и реактивных пользовательских интерфейсов, где визуальное состояние элемента должно меняться в ответ на действия пользователя.
Это ключевые слова, добавляемые к селекторам, которые указывают на специальное состояние выбранного элемента. Псевдоклассы позволяют стилизовать элементы на основе их состояния в документе, без необходимости добавления дополнительных классов или ID напрямую в HTML-код. С их помощью можно, например, изменить внешний вид ссылок при наведении курсора, стилизовать четные и нечетные элементы списка, изменять стиль элементов при получении фокуса и многое другое.
:hover — применяется к элементу, когда на него наводят курсор мыши.a:hover {
color: red; /* Ссылка станет красной при наведении /
}:focus — применяется к элементу, когда он получает фокус (например, при переходе на элемент с помощью клавиатуры или при клике мыши).input:focus {
border-color: blue; / Граница инпута станет синей при фокусе /
}:active — применяется к элементу в момент его активации пользователем (например, во время клика по кнопке).button:active {
transform: scale(0.98); / Кнопка немного уменьшится при клике /
}:nth-child() — позволяет стилизовать элементы в зависимости от их порядка среди детей родительского элемента.li:nth-child(odd) {
background-color: gray; / Заливка каждого нечетного элемента списка /
}:not() — исключает из выборки элементы, соответствующие указанному селектору.div:not(.special) {
color: green; / Применяется к каждому div, который не имеет класса special */
}🚩Зачем нужны псевдоклассы?
Они делают CSS более мощным и гибким, позволяя разработчикам применять стили к элементам на основе их состояния или положения в документе, без изменения HTML-структуры. Это особенно полезно для создания интерактивных и реактивных пользовательских интерфейсов, где визуальное состояние элемента должно меняться в ответ на действия пользователя.
🔥1💯1🆒1
🧐 Почему map используют чаще, чем объект?
Хотя объекты
🛑`Map` может использовать любые типы данных в качестве ключей
В объектах
Пример с
🛑`Map` хранит порядок ключей
В объекте
Пример с
🛑`Map` быстрее при частых добавлениях/удалениях
Объекты
Разница в скорости
В
В объекте
🛑У `Map` есть удобные методы
Объект
В объекте
🛑`Map` не имеет проблем с прототипами
В объекте
Чтобы обойти это, приходится делать так
В
Хотя объекты
{} исторически использовались как ассоциативные массивы (ключ-значение), у Map есть ряд преимуществ, которые делают его более удобным в большинстве случаев.🛑`Map` может использовать любые типы данных в качестве ключей
В объектах
{} ключи всегда автоматически приводятся к строке. const obj = {};
const key1 = {};
const key2 = {};
obj[key1] = "value1";
obj[key2] = "value2";
console.log(obj); // { '[object Object]': 'value2' }
console.log(obj[key1]); // "value2" (ключи перезаписались, потому что оба стали "[object Object]")Пример с
Map: const map = new Map();
map.set(key1, "value1");
map.set(key2, "value2");
console.log(map.get(key1)); // "value1"
console.log(map.get(key2)); // "value2"
🛑`Map` хранит порядок ключей
В объекте
{} порядок ключей не гарантируется (особенно для числовых ключей). const obj = { 2: "two", 1: "one", 3: "three" };
console.log(Object.keys(obj)); // ["1", "2", "3"] (порядок числовых ключей изменился!)Пример с
Map const map = new Map();
map.set(2, "two");
map.set(1, "one");
map.set(3, "three");
console.log([...map.keys()]); // [2, 1, 3] (порядок сохраняется!)
🛑`Map` быстрее при частых добавлениях/удалениях
Объекты
{} оптимизированы для хранения структуры данных, но операции delete и Object.keys(obj).length могут быть медленными, потому что движок JavaScript выполняет дополнительные проверки.Разница в скорости
В
Map операции .set(), .get(), .delete() выполняются быстрее.В объекте
{} delete obj[key] может работать медленнее, так как JavaScript оптимизирует объекты для других целей.🛑У `Map` есть удобные методы
Объект
{} не имеет встроенных методов для работы с ключами и значениями. Чтобы, например, узнать размер объекта, приходится использовать Object.keys(obj).length.const map = new Map();
map.set("a", 1);
map.set("b", 2);
console.log(map.size); // 2
console.log(map.has("a")); // true
console.log(map.delete("b")); // true (удалит "b")
В объекте
{}const obj = { a: 1, b: 2 };
console.log(Object.keys(obj).length); // 2 (нужно вызывать Object.keys())
console.log(obj.hasOwnProperty("a")); // true (менее удобный синтаксис)
delete obj.b; // Удаление ключа🛑`Map` не имеет проблем с прототипами
В объекте
{} могут быть неожиданные проблемы, если ключ совпадает с именем встроенного метода.const obj = {};
console.log(obj.toString); // [Function: toString] (унаследованное свойство!)
console.log(obj["toString"]); // [Function: toString] (может вызвать баги)Чтобы обойти это, приходится делать так
const obj = Object.create(null); // Теперь у объекта нет прототипа
obj.toString = "custom";
console.log(obj.toString); // "custom"
В
Map таких проблем нетconst map = new Map();
map.set("toString", "custom");
console.log(map.get("toString")); // "custom" (никаких багов!)
🔥3💯1