Последовательность выполнения скриптов можно контролировать несколькими способами:
Скрипты выполняются в порядке их появления в документе.
<script src="script1.js"></script>
<script src="script2.js"></script>
Скрипты с атрибутом
defer
выполняются в порядке их появления после загрузки и парсинга HTML.<script src="script1.js" defer></script>
<script src="script2.js" defer></script>
Скрипты с атрибутом
async
выполняются по мере их загрузки, независимо от порядка в HTML.<script src="script1.js" async></script>
<script src="script2.js" async></script>
defer
и async
позволяют управлять этим процессом: defer
сохраняет порядок, async
выполняет скрипты по мере загрузки.Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤2
Event Loop (цикл событий) — это один из ключевых аспектов асинхронного программирования, обеспечивающий возможность выполнения JavaScript-кода в однопоточном режиме, не блокируя выполнение других операций. Это достигается за счёт использования цикла, который постоянно проверяет, есть ли задачи для выполнения, и если они есть, то выполняет их одну за другой.
JavaScript работает в одном потоке, что означает, что в любой момент времени может выполняться только одна операция. Однако, благодаря Event Loop, он способен обрабатывать асинхронные действия, такие как запросы к серверу, таймеры или обработка событий пользовательского интерфейса, не останавливаясь для ожидания их завершения.
Содержит текущий стек выполнения функций. Когда функция вызывается, она добавляется в стек вызовов, а когда выполнение функции заканчивается, она удаляется из стека.
Когда асинхронная операция завершается, её callback (функция обратного вызова) помещается в очередь обратных вызовов.
Цикл событий непрерывно проверяет стек вызовов на наличие функций для выполнения. Если стек вызовов пуст, Event Loop извлекает первую функцию из очереди обратных вызовов и помещает её в стек вызовов для выполнения.
Это позволяет JavaScript обрабатывать длительные операции, такие как загрузка данных, не блокируя главный поток и обеспечивая отзывчивость приложения.
console.log('Первое сообщение');
setTimeout(() => {
console.log('Сообщение из setTimeout');
}, 0);
console.log('Второе сообщение');
В этом примере, несмотря на то что setTimeout имеет задержку в 0 миллисекунд, вывод в консоль будет следующим:
Первое сообщение
Второе сообщение
Сообщение из setTimeout
Это происходит потому, что вызов setTimeout помещает его callback в очередь обратных вызовов, который будет выполнен только после того, как выполнение текущего кода в стеке вызовов завершится и стек станет пустым.
Event Loop позволяет JavaScript выполнять асинхронные операции, обрабатывая их по мере завершения, не блокируя при этом главный поток выполнения. Это делает возможным создание отзывчивых и асинхронных веб-приложений.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍30❤7
Замыкание — это функция, которая запоминает своё лексическое окружение даже после того, как она выполняется вне своей области видимости. Другими словами, функция, объявленная в определённой области видимости, сохраняет доступ к переменным этой области, даже когда она вызывается за пределами своего первоначального контекста. Это важно по нескольким причинам:
Позволяют скрыть переменные внутри функции, делая их недоступными извне, кроме как через другую функцию, созданную в той же области видимости.
Позволяют сохранять состояние между вызовами функции, без использования глобальных переменных.
Облегчают каррирование и другие техники функционального программирования, позволяя функциям работать с переменными, которые были в их области видимости в момент создания.
function создатьСчетчик() {
let количество = 0; // переменная количество "замкнута" внутри функции увеличить
function увеличить() {
количество += 1;
return количество;
}
return увеличить;
}
const счетчик = создатьСчетчик();
console.log(счетчик()); // 1
console.log(счетчик()); // 2
В этом примере, функция
увеличить
имеет доступ к переменной количество
, даже после того как создатьСчетчик
завершила выполнение. Это происходит благодаря механизму замыканий: увеличить
"запоминает" переменные, которые были в её области видимости в момент создания.Замыкание — это когда функция запоминает и имеет доступ к переменным из своей области видимости, даже после того, как она выполняется в другом контексте. Это позволяет функциям сохранять данные между вызовами и обеспечивать инкапсуляцию состояния, что очень полезно для создания приватных переменных и управления состоянием в программе.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥2💊1
Anonymous Quiz
13%
display: grid
15%
display: inline-block
65%
display: flex
6%
display: block
👍8🤯2❤1
Promise (обещание) — это объект, представляющий завершение (или неудачу) асинхронной операции и её результат. Он позволяет ассоциировать обработчики с асинхронным действием, тем самым избавляя от необходимости использовать обратные вызовы (callback-функции). Они упрощают работу с асинхронными операциями, такими как AJAX-запросы или чтение файлов, позволяя написать код, который проще понять и поддерживать.
Начальное состояние; асинхронная операция не завершена.
Операция завершена успешно, и promise возвращает результат.
Операция завершена с ошибкой, и promise возвращает причину отказа.
let обещание = new Promise(function(resolve, reject) {
// Эмуляция асинхронной операции, например, запроса к серверу
setTimeout(() => {
// Условие успешного выполнения операции
if (/* условие успеха */) {
resolve("данные получены");
} else {
reject("ошибка при получении данных");
}
}, 1000);
});
обещание.then(
function(результат) { console.log(результат); }, // обработчик успеха
function(ошибка) { console.log(ошибка); } // обработчик ошибки
);
Promise поддерживает цепочки вызовов (
then
), что позволяет организовывать асинхронный код последовательно и читабельно. Кроме того, существуют вспомогательные методы, такие как Promise.all
, Promise.race
, Promise.resolve
, и Promise.reject
, которые облегчают работу с группами асинхронных операций.Promise — это способ организации асинхронного кода, который предоставляет более удобный и понятный интерфейс для работы с асинхронными операциями, чем традиционные callback-функции. У каждого обещания есть три состояния: ожидание, исполнено и отклонено, которые помогают управлять результатом асинхронных операций.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤1🤯1
Anonymous Quiz
71%
Object.assign()
5%
Object.create()
12%
Object.defineProperty()
12%
Object.keys
👍9
Существует несколько основных типов данных, которые можно разделить на две категории: примитивные типы и объекты.
42
или 3.14
."Привет, мир!"
.true
и false
, и используется для работы с логическими операциями.undefined
, если она была объявлена, но ей не было присвоено никакого значения.null
является объектом из-за ошибки в ранних версиях JavaScript.Number
.Важно понимать разницу между примитивными типами и объектами, поскольку это влияет на способ работы с переменными и передачу данных в функции.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥9❤2
Virtual DOM (виртуальный Document Object Model) - это концепция, широко используемая в разработке интерфейсов, особенно в библиотеке React от Facebook, а также в других современных фронтенд-фреймворках. DOM - это структура данных, используемая браузерами для представления веб-страниц. Она позволяет программам изменять структуру, стиль и содержание веб-страницы, взаимодействуя с HTML и CSS. Проблема обычного DOM заключается в том, что он может быть довольно медленным при частых обновлениях, поскольку изменения в нем приводят к перерисовке элементов страницы, что может быть ресурсоёмким процессом.
Эта концепция призвана решить данную проблему. Вместо того чтобы напрямую взаимодействовать с реальным DOM при каждом изменении, изменения сначала применяются к виртуальному, который является лёгкой копией реального DOM. После этого, с помощью процесса, называемого согласованием (reconciliation), виртуальный DOM сравнивается с предыдущей его версией, чтобы определить, какие именно изменения необходимо внести в реальный. Это позволяет минимизировать количество операций с реальным DOM, что значительно увеличивает производительность приложения.
const element = document.getElementById('myElement');
element.textContent = 'Новый текст';
В этом случае каждое изменение непосредственно обновляет DOM, что может быть неэффективно при множественных обновлениях.
class MyComponent extends React.Component {
render() {
return <div>Новый текст</div>;
}
}
В этом случае, при изменении состояния компонента, React сначала применяет изменения к виртуальному DOM, а затем, используя согласование, оптимально обновляет реальный.
Виртуальный Document Object Model позволяет писать код, как если бы можно было менять любую часть веб-страницы в любой момент, не беспокоясь о производительности. Это делает разработку интерфейсов более интуитивно понятной и эффективной.
Virtual DOM - это технология для оптимизации обновлений веб-интерфейсов, позволяющая ускорить и упростить разработку сложных пользовательских интерфейсов, минимизируя взаимодействие с медленным реальным DOM.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26❤3
Ключевые слова let и var используются для объявления переменных, но между ними есть несколько важных различий, касающихся области видимости, поднятия (hoisting) и создания блока.
Объявления переменных с использованием
var
имеют функциональную область видимости, что означает, что переменная, объявленная с помощью нее внутри функции, доступна везде в этой функции.В отличие от
var
, let
имеет блочную область видимости. Это означает, что переменная, объявленная с помощью нее в блоке (например, в цикле или условном операторе), будет доступна только в пределах этого блока.Переменные, объявленные с ее помощью, поднимаются в начало функции или скрипта. Это означает, что они могут быть использованы до своего объявления, хотя до инициализации они будут иметь значение
undefined
.Переменные, объявленные с ее помощью, также поднимаются, но не инициализируются. Попытка доступа к такой переменной до её объявления приведет к ошибке
ReferenceError
. Это поведение известно как "временная мертвая зона" (temporal dead zone, TDZ).Переменные, объявленные с ее помощью в глобальном контексте, становятся свойствами глобального объекта (
window
в браузерах).Переменные, объявленные с ее помощью в глобальном контексте, не становятся свойствами глобального объекта.
if (true) {
var varVariable = "Я доступен везде в функции";
let letVariable = "Я доступен только в этом блоке";
}
console.log(varVariable); // Работает, потому что var имеет функциональную область видимости
console.log(letVariable); // Ошибка, потому что let имеет блочную область видимости
console.log(a); // undefined из-за поднятия
var a = 3;
console.log(b); // ReferenceError из-за временной мертвой зоны
let b = 4;
let
предоставляет более строгую и предсказуемую область видимости переменных, что улучшает управляемость кодом и уменьшает вероятность ошибок, связанных с неожиданным доступом или изменением данных. var
может быть полезен, когда нужна функциональная область видимости, но сейчас let
и const
(для объявления констант) являются предпочтительными вариантами для управления переменными.В то время как
var
объявляет переменную, доступную во всей функции, а let
ограничивает видимость переменной блоком, в котором она объявлена.Please open Telegram to view this post
VIEW IN TELEGRAM
👍25❤6
Anonymous Quiz
6%
static
19%
absolute
69%
fixed
5%
relative
🔥4🤯2
Ключевые слова var и const используются для объявления переменных, но они имеют ряд существенных различий, которые важно понимать для правильного использования в коде.
Объявления переменных с ее использованием имеют функциональную область видимости (function scope), что означает, что переменная доступна везде в функции, где была объявлена.
Как и
let
, она имеет блочную область видимости (block scope), ограничивая доступность переменной блоком (например, циклом или условным оператором), в котором была объявлена.Переменные, объявленные с помощью нее, могут быть переназначены и изменены. Это означает, что после объявления переменной её можно не только изменить, но и полностью переназначить на другое значение.
Переменные, объявленные с помощью нее, не могут быть переназначены. Однако, если переменная представляет собой объект или массив, её содержимое может быть изменено (например, можно добавить новое свойство в объект или новый элемент в массив). Важно понимать, что
const
предотвращает переназначение самой переменной, но не защищает содержимое объекта от изменений.Переменные, объявленные через нее, поднимаются в начало своей функциональной области видимости перед выполнением кода. Однако до их объявления в коде они будут иметь значение
undefined
.Подобно
let
, ее объявления тоже поднимаются, но доступ к переменной до её объявления в коде приведёт к ошибке ReferenceError
. Это явление известно как "временная мертвая зона".Эти переменные можно объявить без инициализации, и их начальное значение будет
undefined
.Эти переменные требуют обязательной инициализации при объявлении. Если попытаться объявить его без инициализации, это приведет к синтаксической ошибке.
var varVariable = 1;
varVariable = 2; // Переназначение возможно
const constVariable = { a: 1 };
constVariable.a = 2; // Изменение содержимого объекта возможно
// constVariable = { b: 3 }; // Переназначение вызовет ошибку
if (true) {
var varScope = "доступна везде в функции";
const constScope = "доступна только в этом блоке";
}
console.log(varScope); // Выведет строку
console.log(constScope); // Ошибка: constScope не определена
Использование
var
, let
и const
зависит от нужд разработки. var
предоставляет функциональную область видимости и большую гибкость за счёт возможности переназначения, но это может привести к ошибкам из-за непреднамеренных изменений или переназначений. const
используется для объявления переменных, значение которых не должно изменяться, что помогает предотвратить случайное переназначение и делает код более предсказуемым. Сейчас let
и const
являются предпочтительными для блочной области видимости и контроля за изменяемостью данных.Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤3😁1👀1
Anonymous Quiz
24%
border-box
3%
padding-box
72%
content-box
2%
margin-box
👍10❤1
Операторы == (равно) и === (строго равно) используются для сравнения значений, но работают по-разному, что важно понимать для написания надёжного и предсказуемого кода.
Сравнивает значения двух переменных, но перед сравнением производит приведение типов, если переменные относятся к разным типам. Это означает, что если вы сравниваете число с строкой, JavaScript попытается преобразовать строку в число, а затем сравнить эти два значения. Этот процесс может привести к неинтуитивным результатам.
'2' == 2 // true, так как строка '2' преобразуется в число 2 перед сравнением
0 == false // true, так как 0 и false считаются эквивалентными
null == undefined // true, специальное правило языка
В отличие от ==, он сравнивает и значения, и типы без приведения типов. Если типы различаются, оператор немедленно возвращает
false
, не пытаясь преобразовать один тип в другой. Это делает сравнение более строгим и предсказуемым.'2' === 2 // false, так как типы различаются
0 === false // false, разные типы: число и булево значение
null === undefined // false, разные типы
Понимание разницы между
==
и ===
критически важно, чтобы избежать ошибок, связанных с неожиданным приведением типов. Использование ===
помогает гарантировать, что сравниваемые значения совпадают по типу и значению, что является более безопасным подходом в большинстве случаев. В целом, рекомендуется использовать ===
для сравнения значений, чтобы код был более читабельным и предсказуемым.== сравнивает значения, приводя их к общему типу, что может привести к неожиданным результатам из-за неявного приведения типов. === сравнивает как значения, так и типы без приведения типов, обеспечивая более строгое и предсказуемое сравнение. Использование
===
рекомендуется для большей надёжности и читабельности кода.Please open Telegram to view this post
VIEW IN TELEGRAM
👍18😁3❤1🔥1
Anonymous Quiz
47%
<section>
27%
<article>
4%
<div>
22%
<header>
🤔13❤4👍3
Изоляция стилей в веб-разработке важна для предотвращения конфликтов CSS и обеспечения того, чтобы стили одного компонента или раздела страницы не влияли на другие. Существует несколько таких подходов:
Это самый простой способ избежать конфликтов. Может быть достигнуто с помощью методологий именования, таких как BEM (Блок, Элемент, Модификатор), которая предлагает чёткую структуру для именования классов.
Они представляют собой подход, при котором классы и идентификаторы, определенные в CSS-файле, автоматически преобразуются в уникальные имена. Это позволяет избежать конфликтов имен классов между различными компонентами. Они поддерживаются в сборщиках, таких как Webpack, и во фреймворках, например, в Create React App.
Библиотеки CSS-in-JS, такие как Styled-components и Emotion, позволяют писать CSS прямо в JavaScript-файлах. Это обеспечивает полную изоляцию стилей, поскольку стили применяются непосредственно к компонентам, и конфликты имен классов исключаются.
Технология, позволяющая инкапсулировать DOM-дерево и стили компонента так, что они не влияют на основной документ. Это ключевая часть Web Components и позволяет создавать полностью изолированные компоненты.
Некоторые современные фреймворки и инструменты, такие как Vue.js, предлагают возможность использования scoped стилей, где CSS применяется исключительно к компоненту, в котором он объявлен, без воздействия на остальную часть приложения.
Размещение контента внутри
<iframe>
позволяет полностью изолировать его стили от остальной части страницы. Это крайний способ, который может быть полезен для встраивания стороннего контента, но он приносит дополнительную сложность и ограничения.Сами по себе не обеспечивают изоляцию, их можно использовать для создания гибкой системы тем, которая позволяет контролировать влияние глобальных стилей на компоненты и облегчает поддержание стилевой согласованности.
Изоляция стилей — важный аспект разработки надёжных и масштабируемых веб-приложений. Выбор метода зависит от конкретных требований проекта, технологического стека и предпочтений разработчика. Использование современных инструментов и подходов, таких как CSS-модули, CSS-in-JS и Web Components, может значительно упростить управление стилями и повысить качество конечного продукта.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19❤1🔥1
Anonymous Quiz
87%
style
4%
class
7%
styles
2%
stylesheet
👍7
Методы call, apply и bind принадлежат к функциональному объекту
Function
и используются для указания контекста this
при вызове функции. Хотя все три метода позволяют контролировать значение this
внутри функции, между ними существуют ключевые различия в способе использования и поведении.Вызывает функцию, явно устанавливая
this
в первом аргументе. Остальные аргументы передаются в вызываемую функцию как есть.function greet(message, name) {
console.log(${message}, ${name}. This is ${this});
}
greet.call("Earth", "Hello", "Alice"); // "Hello, Alice. This is Earth"
Здесь он используется для вызова функции
greet
с this
, установленным в "Earth"
, и двумя дополнительными аргументами "Hello"
и "Alice"
.Очень похож на
call
, но принимает аргументы в виде массива, а не по отдельности.function greet(message, name) {
console.log(
${message}, ${name}. This is ${this}
);
}
greet.apply("Earth", ["Hello", "Alice"]); // "Hello, Alice. This is Earth"
В этом случае он вызывает функцию
greet
с this
, установленным в "Earth"
, и аргументами, переданными в виде массива.Создаёт новую функцию, которая, когда она вызывается, имеет установленный контекст
this
, указанный в первом аргументе. В отличие от call
и apply
, bind
не вызывает функцию сразу, а возвращает новую функцию, которую можно вызвать позже.function greet(message, name) {
console.log(
${message}, ${name}. This is ${this}
);
}
const greetEarth = greet.bind("Earth", "Hello", "Alice");
greetEarth(); // "Hello, Alice. This is Earth"
Здесь он используется для создания новой функции
greetEarth
, которая при вызове выводит тот же результат, что и предыдущие примеры, но с тем отличием, что контекст this
и аргументы были заранее заданы.call
вызывает функцию с указанным контекстом this
и отдельными аргументами.apply
аналогичен call
, но принимает аргументы в виде массива.bind
создаёт новую функцию с предустановленным контекстом this
и аргументами, если они были предоставлены, но не вызывает её немедленно.Эти методы позволяют более гибко управлять контекстом выполнения функций, что является мощным инструментом, особенно при работе с объектно-ориентированным кодом и асинхронными вызовами.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24😁1
Anonymous Quiz
27%
div p
63%
div > p
4%
div + p
6%
div ~ p
👍22
В JavaScript существует несколько способов создания функций. Каждый способ имеет свои особенности и применяется в зависимости от контекста. Рассмотрим основные из них: функциональные выражения, функциональные объявления, стрелочные функции и методы объекта.
Это наиболее традиционный способ объявления функции. Функция, объявленная таким образом, доступна во всем блоке кода благодаря поднятию (hoisting).
function greet(name) {
return `Hello, ${name}!`;
}
console.log(greet("Alice")); // "Hello, Alice!"
Функция, объявленная как выражение, не поднимается. Такая функция может быть анонимной или именованной.
const greet = function(name) {
return `Hello, ${name}!`;
};
console.log(greet("Bob")); // "Hello, Bob!"
Стрелочные функции введены в ES6. Они имеют более короткий синтаксис и не имеют своего
this
, arguments
, super
, или new.target
.const greet = (name) => `Hello, ${name}!`;
console.log(greet("Charlie")); // "Hello, Charlie!"
this
, используют значение this
из внешнего контекста.Функции могут быть объявлены как методы объекта. В ES6 для этого используется сокращенный синтаксис.
const person = {
name: "David",
greet() {
return `Hello, ${this.name}!`;
}
};
console.log(person.greet()); // "Hello, David!"
this
.Конструкторные функции используются для создания объектов с помощью ключевого слова
new
.function Person(name) {
this.name = name;
}
Person.prototype.greet = function() {
return `Hello, ${this.name}!`;
};
const person = new Person("Eve");
console.log(person.greet()); // "Hello, Eve!"
new
для создания новых объектов.Генераторные функции возвращают объект-итератор и могут приостанавливать своё выполнение с помощью ключевого слова
yield
.function* generateSequence() {
yield 1;
yield 2;
yield 3;
}
const generator = generateSequence();
console.log(generator.next().value); // 1
console.log(generator.next().value); // 2
console.log(generator.next().value); // 3
this
.new
для создания объектов.Короткий ответ: В JavaScript можно создавать функции разными способами: обычные функции, функции внутри переменных, стрелочные функции, функции внутри объектов, функции для создания объектов и специальные функции, которые могут делать паузы.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21👍13❤2
Существует два основных способа объявления функций: Function Declaration (Объявление Функции) и Function Expression (Функциональное Выражение). Хотя оба подхода определяют функции, между ними есть несколько ключевых различий, влияющих на поведение и использование функций в коде.
Способ объявления функции, при котором используется ключевое слово
function
, за которым следует имя функции.function sum(a, b) {
return a + b;
}
Поднимаются вверх их области видимости перед выполнением кода, что позволяет вызывать функции до их объявления в коде.
Определяется её местом в коде: в глобальной области видимости, в области видимости другой функции или в блочной области видимости (в строгом режиме).
Способ объявления функции, при котором функция создаётся в рамках выражения. Функциональные выражения могут быть анонимными или именованными.
const sum = function(a, b) {
return a + b;
};
Переменные, объявленные через
var
, поднимаются, но инициализируются значением undefined
, поэтому функциональное выражение не будет доступно до его объявления в коде. Если функциональное выражение объявлено через let
или const
, то оно вообще не будет доступно до объявления из-за временной мертвой зоны.Функциональные выражения могут быть анонимными (не иметь имени) или именованными. Именованные функциональные выражения могут быть полезны для улучшения читаемости кода и при отладке.
Функциональные выражения могут использоваться в любых местах, где допустимы выражения, например, в качестве аргументов для других функций.
Основное различие между Function Declaration и Function Expression заключается в том, что объявления функций поднимаются и доступны в своей области видимости до выполнения кода, в то время как функциональные выражения доступны только после своего объявления в коде. Выбор между этими двумя способами объявления функций зависит от конкретной задачи, стиля программирования и предпочтений разработчика. Function Expression предоставляет большую гибкость, особенно когда необходимо использовать анонимные функции или присваивать функции переменным.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27❤4🔥2