Композиция (программирование)
Агрегирование в общем смысле — это объединение нескольких элементов в единое целое. Результат агрегирования называют агрегатом.
В программировании под агрегированием (так же называемым композицией и включением) подразумевают методику создания нового класса из уже существующих классов. Об агрегировании также часто говорят как об «отношении принадлежности» по принципу «у машины есть корпус, колеса и двигатель».
Вложенные объекты нового класса обычно объявляются закрытыми, что делает их недоступными для прикладных программистов, работающих с классом. С другой стороны, создатель класса может изменять эти объекты, не нарушая работы существующего клиентского кода. Кроме того, замена вложенных объектов на стадии выполнения программы позволяет динамически изменять её поведение. Механизм наследования такой гибкостью не обладает, поскольку для производных классов устанавливаются ограничения, проверяемые на стадии компиляции.
На базе агрегирования реализуется методика делегирования, когда поставленная перед внешним объектом задача перепоручается внутреннему объекту, специализирующемуся на решении задач такого рода.
Wikimedia Foundation . 2010 .
- Композиция «Золотое руно»
- Композиция (музыка)
Смотреть что такое «Композиция (программирование)» в других словарях:
- Агрегирование (программирование) — В этой статье не хватает ссылок на источники информации. Информация должна быть проверяема, иначе она может быть поставлена под сомнение и удалена. Вы можете отредактировать эту статью, добавив ссылки на авторитетные источники … Википедия
- Субъектно-ориентированное программирование — Парадигмы программирования Агентно ориентированная Компонентно ориентированная Конкатенативная Декларативная (контрастирует с Императивной) Ограничениями Функциональная Потоком данных Таблично ориентированная (электронные таблицы) Реактивная … Википедия
- Класс (программирование) — У этого термина существуют и другие значения, см. Класс. Класс в программировании набор методов и функций. Другие абстрактные типы данных метаклассы, интерфейсы, структуры, перечисления характеризуются какими то своими, другими… … Википедия
- Класс (объектно-ориентированное программирование) — Класс, наряду с понятием «объект», является важным понятием объектно ориентированного подхода в программировании (хотя существуют и бесклассовые объектно ориентированные языки, например, Прототипное программирование). Под классом подразумевается… … Википедия
- Функциональная зависимость (программирование) — Функциональная зависимость концепция, лежащая в основе многих вопросов, связанных с реляционными базами данных, включая, в частности, их проектирование. Математически представляет бинарное отношение между множествами атрибутов данного… … Википедия
- That’s the Way Love Goes — «That’s the Way Love Goes» Сингл Джанет Джексон из альбома janet … Википедия
- New Order — Об альбоме группы Testament см. статью The New Order. New Order New … Википедия
- Диаграмма классов — Для улучшения этой статьи желательно?: Викифицировать статью. В UML диаграмма классов является типом диаграммы статичес … Википедия
- Vision of Love — «Vision of Love» Сингл Мэрайи Кэри из альбома Mariah Carey Выпущен 15 мая 1990 Формат CD сингл Кассетный сингл 7 сингл … Википедия
- Music (альбом Мадонны) — У этого термина существуют и другие значения, см. Music. Music … Википедия
Композиция в Python
Еще одной особенностью объектно-ориентированного программирования является возможность реализовывать так называемый композиционный подход. Заключается он в том, что есть класс-контейнер, он же агрегатор, который включает в себя вызовы других классов. В результате получается, что при создании объекта класса-контейнера, также создаются объекты других классов.
Чтобы понять, зачем нужна композиция в программировании, проведем аналогию с реальным миром. Большинство биологических и технических объектов состоят из более простых частей, также являющихся объектами. Например, животное состоит из различный органов (сердце, желудок), компьютер — из различного «железа» (процессор, память).
Не следует путать композицию с наследованием, в том числе множественным. Наследование предполагает принадлежность к какой-то общности (похожесть), а композиция — формирование целого из частей. Наследуются атрибуты, т. е. возможности, другого класса, при этом объектов непосредственно родительского класса не создается. При композиции же класс-агрегатор создает объекты других классов.
Рассмотрим на примере реализацию композиции в Python. Пусть, требуется написать программу, которая вычисляет площадь обоев для оклеивания помещения. При этом окна, двери, пол и потолок оклеивать не надо.
Прежде, чем писать программу, займемся объектно-ориентированным проектированием. То есть разберемся, что к чему. Комната – это прямоугольный параллелепипед, состоящий из шести прямоугольников. Его площадь представляет собой сумму площадей составляющих его прямоугольников. Площадь прямоугольника равна произведению его длины на ширину.
По условию задачи обои клеятся только на стены, следовательно площади верхнего и нижнего прямоугольников нам не нужны. Из рисунка видно, что площадь одной стены равна xz , второй – уz . Противоположные прямоугольники равны, значит общая площадь четырех прямоугольников равна S = 2xz + 2уz = 2z(x+y) . Потом из этой площади надо будет вычесть общую площадь дверей и окон, поскольку они не оклеиваются.
Можно выделить три типа объектов – окна, двери и комнаты. Получается три класса. Окна и двери являются частями комнаты, поэтому пусть они входят в состав объекта-помещения.
Для данной задачи существенное значение имеют только два свойства – длина и ширина. Поэтому классы «окна» и «двери» можно объединить в один. Если бы были важны другие свойства (например, толщина стекла, материал двери), то следовало бы для окон создать один класс, а для дверей – другой. Пока обойдемся одним, и все что нам нужно от него – площадь объекта:
class WinDoor: def __init__(self, x, y): self.square = x * y
Класс «комната» – это класс-контейнер для окон и дверей. Он должен содержать вызовы класса «ОкноДверь».
Хотя помещение не может быть совсем без окон и дверей, но может быть чуланом, дверь которого также оклеивается обоями. Поэтому имеет смысл в конструктор класса вынести только размеры самого помещения, без учета элементов «дизайна», а последние добавлять вызовом специально предназначенного для этого метода, который будет добавлять объекты-компоненты в список.
class Room: def __init__(self, x, y, z): self.square = 2 * z * (x + y) self.wd = [] def add_wd(self, w, h): self.wd.append(WinDoor(w, h)) def work_surface(self): new_square = self.square for i in self.wd: new_square -= i.square return new_square r1 = Room(6, 3, 2.7) print(r1.square) # выведет 48.6 r1.add_wd(1, 1) r1.add_wd(1, 1) r1.add_wd(1, 2) print(r1.work_surface()) # выведет 44.6
Практическая работа
Приведенная выше программа имеет ряд недочетов и недоработок. Требуется исправить и доработать, согласно следующему плану.
При вычислении оклеиваемой поверхности мы не «портим» поле self.square . В нем так и остается полная площадь стен. Ведь она может понадобиться, если в списке wd произойдут изменения, и придется заново вычислять оклеиваемую площадь.
Однако в классе не предусмотрено сохранение длин сторон, хотя они тоже могут понадобиться. Например, если потребуется изменить одну из величин у уже существующего объекта. Площадь же помещения всегда можно вычислить, если хранить исходные параметры. Поэтому сохранять саму площадь в поле не обязательно.
Исправьте код так, чтобы у объектов Room было четыре поля – width , length , height и wd . Площади (полная и оклеиваемая) должны вычислять лишь при необходимости путем вызова методов.
Программа вычисляет площадь под оклейку, но ничего не говорит о том, сколько потребуется рулонов обоев. Добавьте метод, который принимает в качестве аргументов длину и ширину одного рулона, а возвращает количество необходимых, исходя из оклеиваемой площади.
Разработайте интерфейс программы. Пусть она запрашивает у пользователя данные и выдает ему площадь оклеиваемой поверхности и количество необходимых рулонов.
Курс с примерами решений практических работ:
pdf-версия
X Скрыть Наверх
Объектно-ориентированное программирование на Python
Композиция (программирование)
В компьютерном программировании , композиция представляет собой метод , который позволяет несколько элементов программирования , чтобы быть объединены вместе , чтобы получить элемент с более сложной функциональностью. Мы различаем композицию функций, композицию объектов и композицию в моделях.
Резюме
- 1 Состав функций
- 2 Состав предметов
- 3 Концептуальное моделирование
- 4 Пример кода на C ++
- 5 Примечания и ссылки
Состав функций
Композиция функций заключается в определении новой функции путем объединения нескольких функций вместе.
Этот процесс непосредственно вдохновлен композицией функций в математике , где результат одной функции используется как параметр другой. Две функции и такие как и могут, например, быть объединены в функцию, такую как . В процедурном программировании эту композицию можно выразить серией инструкций: ж грамм z знак равно ж ( y ) y знак равно грамм ( Икс ) час z знак равно ж ( грамм ( Икс ) )
double h(double x) double y = g(x); double z = f(y); return z; >
Он также может объединять выражения в более компактную форму, что упрощает обслуживание:
double h(double x) return f(g(x)); >
Некоторые языки функционального программирования, такие как F #, предлагают операторам составлять функции следующим образом:
let h = g >> f
В области программирования композиция функций обозначает в расширении любую форму комбинации функций или процедур.
Состав объектов
Объектно-ориентированное программирование основано на концепции объектов и принцип инкапсуляции для структуры данных и связанных с ними операций. Затем композиция объектов состоит из определения объектов или типов, составленных путем комбинирования объектов или более простых типов с соблюдением их интерфейса и игнорированием всего их внутреннего функционирования.
Композиция отличается от механизма наследования в языках, основанных на классах: наследование состоит из специализации классов путем добавления к ним дополнительных элементов и переопределения определенного поведения. Класс объекта определяется во время его создания (мы говорим, что объект является экземпляром класса), и объект не может изменить класс после его создания. С другой стороны, состав объектов остается динамичным: каждый компонент может быть в любой момент заменен компонентом совместимого класса.
Композиция также отличается от механизма прототипирования, используемого в языках, ориентированных на прототипы, таких как JavaScript : новый объект, созданный из прототипа, наследует композиции прототипа, но сам может быть предметом дополнительных композиций.
Концептуальное моделирование

Графический символ композиции в схемах моделирования UML .
Композиция объектов может реализовывать на уровне программирования свойства и отношения ассоциации, агрегирования или композиции модели класса в UML. Однако концептуально композиция имеет более ограничительное значение.
Композиционная связь символизирует наличие особой, так называемой «сильной» агрегации между двумя сущностями (классами).
Композиция определяется следующими пунктами:
Время жизни: любой агрегированный класс уничтожается при уничтожении составного класса. Эксклюзивность: агрегированный класс может быть агрегирован только одним составным классом. Понятие «является частью».
Класс Car — это составной класс, состоящий из элемента класса Carburetor (карбюратор). Класс Carburetor — это совокупный класс. Когда экземпляр класса Car (автомобиль) разрушается (например, в результате аварии), карбюратор (экземпляр класса Carburetor) тоже. Карбюратор является частью автомобиля.
Обратите внимание, что различие между составом и агрегированием не является абсолютным: это контекст, который определяет этот выбор. Таким образом, автомобиль можно рассматривать как совокупность пассажирского салона и 4 колес с точки зрения программного обеспечения автомобильной свалки (разрушение автомобиля не приведет к разрушению колес, если они будут восстановлены заранее), или еще как композиция с точки зрения программного обеспечения для моделирования поведения на дороге (где колеса должны рассматриваться как отдельные объекты, но где транспортное средство остается рассматриваться как единое целое).
В UML композиция представлена сплошной линией, украшенной черным ромбиком сбоку от композитного класса.
Пример кода на C ++
// Composition class Voiture private: // Tout objet de type Voiture est responsable de l'attribut 'carbu', lequel est un objet de type Carburateur. // Quand un objet de type Voiture est créé, son attribut 'carbu' est créé automatiquement. // Quand un objet de type Voiture est détruit, son attribut 'carbu' est également détruit. Carburateur carbu; public : const Carburateur & getCarbu() const // Méthode accesseur pour accéder en lecture seule à l'attribut 'carbu' return carbu; > void setCarbu(const Carburateur & unCarbu) // Méthode mutateur pour initialiser l'attribut 'carbu' carbu = unCarbu; > >;
Примечания и ссылки
- (EN) Эта статья частично или полностью взята из статей, озаглавленных на английском языке « Функциональная композиция (информатика) » ( см. Список авторов ) и « Композиция объекта » ( см. Список авторов ) .
- ↑ (in) Дональд Б. Макинтайр , « Роль композиции в компьютерном программировании » , ACM SIGAPL APL Quote Quad , vol. 25, п о 4, 8 июня 1995 г. , стр. 116–133 ( ISSN0163-6006 , DOI10.1145 / 206944.206985 , читать онлайн , по состоянию на 11 октября 2020 г. )
- ↑ (in) Кокс, Брэд , Объектно-ориентированное программирование: эволюционный подход , Addison-Wesley Pub. Co, 1991 г. , 15-17 с. ( ISBN0-201-54834-8 и 978-0-201-54834-1 , OCLC22767291 , читать онлайн )
- ↑ (in) ДеМарко, Том. , Почему программное обеспечение так дорого? : и другие загадки информационной эпохи , паб Дорсет Хаус, 1995 г. , 133-135 с. ( ISBN0-932633-34-X и 978-0-932633-34-7 , OCLC32922371 , читать онлайн )
- ↑ (in) Microsoft , « Функции F # — композиция функций и конвейерная обработка » на docs.microsoft.com (по состоянию на 11 октября 2020 г. )
- ↑ (ru) Гамма, Эрих. , Хелм, Ричард , Джонсон, Ральф Э. и Влиссидес, Джон. , Шаблоны проектирования: элементы объектно-ориентированного программного обеспечения многократного использования , Addison-Wesley, 1995 г. ( ISBN0-201-63361-2 и 978-0-201-63361-0 , OCLC31171684 , читать онлайн )
- ↑ (in) OMG, » Unified Modeling Language Specification Version 2.5.1 » на www.omg.org , 2017 г. (по состоянию на 11 октября 2020 г. ) , стр. 109-110,197-201
Композиция функций. Функциональное программирование

Композиция — это способ построения больших модулей из более мелких. В этой статье подробно рассмотрим композицию на примере JavaScript.
- Парадигмы программирования
- Композиция (рассматривается в этой статье)
- Функторы
- Каррирование
- Чистые функции
- Функции первого класса
Что такое композиция функций?
Композиция — это процесс объединения небольших единиц в более крупные, которые решают более крупные задачи. При композиции входные данные одной функции приходят из выходных данных предыдущей.
Как работает композиция?
Математическая запись определения композиции выглядит следующим образом:
(f ∘ g)(x) = f(g(x))В JavaScript композиция, где f и g - это функции, будет выглядеть так:
const compose = (f, g) => (x) => f(g(x))Функция compose является композицией функций f и g . Выходные данные функции g будут переданы на вход функции f . По другому эта запись выглядела бы следующим образом:
const compose = (f, g) => < return (x) => < const gResult = g(x) const fResult = f(gResult) return fResult >>Пример работы функции compose
Рассмотрим пример с более конкретными функциями:
const getAge = (user) => user.age const isAgeAllowed = (age) => age >= 30Теперь составим композицию из этих маленьких функций - getAge и isAgeAllowed :
const user = < name: 'John', age: 35 >const isAllowedUser = compose( isAgeAllowed, getAge ) isAllowedUser(user) // truecompose выполняет функции справа налево. Мы отправляем объект user в функцию isAgeAllowed . Далее user попадает сначала в getAge , потом результат этой функции попадает в isAgeAllowed .
compose и pipe
Функция pipe очень похожа на функцию compose . Они выполняют одну и ту же роль. Обе объединяют функции в цепочки. Однако их реализация и порядок выполнения функций отличается.
Реализация compose и pipe
compose реализован следующим образом:
const compose = (. fns) => < return (x) =>fns.reduceRight((acc, fn) => fn(acc), x) >pipe реализован следующим образом:
const pipe = (. fns) => < return (x) =>fns.reduce((acc, fn) => fn(acc), x) >Они отличаются лишь в применении функции reduce и reduceRight . Это влияет лишь на порядок выполнения функций.
Порядок выполнения функций
compose выполняет функции справа налево. pipe выполняет функции слева направо.
Пример
Предположим имеется 3 функции: f , g и h . При использовании compose :
compose(f, g, h) ← ← ←Порядок выполнения функций будет таким h , g и далее f (справа налево). И выходные данные будут передаваться в следующую функцию. При использовании pipe :
pipe(f, g, h) → → →Порядок выполнения функций будет таким f , g и далее h (слева направо). И выходные данные будут передаваться в следующую функцию.
Какую функцию использовать?
compose и pipe не сильно отличаются друг от друга. Они решают одну и ту же задачу. compose ближе к математической нотации (f ∘ g)(x) = f(g(x)) . С pipe визуально легче воспринимать порядок выполнения функций.
Реальный пример
- налог (30%, по умолчанию),
- сервисный сбор (10у.е., по умолчанию),
- скидку,
- купон,
- цену доставки на основе веса.
const priceCalculator = ( taxPercentage = 0.3, serviceFees = 10, price, discount, percentCoupon, weight, shippingPricePerKg ) => < // реализация >Реализация без композиции
const priceCalculator = ( taxPercentage = 0.3, serviceFees = 10, price, discount, percentCoupon, weight, shippingPricePerKg ) =>Эта функция выполняет свою задачу, но ее сложно читать, тестировать и отлаживать.
Реализация с композицией
const priceCalculator = ( taxPercentage = 0.3, serviceFees = 10, price, discount, percentCoupon, weight, shippingPricePerKg ) => < const applyTax = (val) =>val * (1 + taxPercentage) const applyServiceFees = (val) => val + serviceFees const applyPercentCoupon = (val) => val - val * percentCoupon const applyDiscount = (val) => val - discount const applyShippingCost = (val) => val + weight * shippingPricePerKg return pipe( applyPercentCoupon, applyDiscount, applyShippingCost, applyServiceFees, applyTax )(price) >Эта реализация выглядит более чистой, ее легко тестировать и отлаживать. Все это благодаря модульности.
Запуск примера
Запустим, передав только price . Очевидно, получим неверный результат, т.к. передали не все обязательные параметры.
priceCalculator(10) // NaNСначала продебажим. Для дебага pipe и compose можно добавить удобную функцию inspect . Она просто логирует в консоль входные данные и возвращает эти данные без изменений.
const inspect = (label) => (x) => < console.log(`$: $`) return x >Добавим inspect в цепочку выполнения.
const priceCalculator = ( taxPercentage = 0.3, serviceFees = 10, price, discount, percentCoupon, weight, shippingPricePerKg ) => < const applyTax = (val) =>val * (1 + taxPercentage) const applyServiceFees = (val) => val + serviceFees const applyPercentCoupon = (val) => val - val * percentCoupon const applyDiscount = (val) => val - discount const applyShippingCost = (val) => val + weight * shippingPricePerKg return pipe( inspect('price'), applyPercentCoupon, inspect('after applyPercentCoupon'), applyDiscount, inspect('after applyDiscount'), applyShippingCost, inspect('after applyShippingCost'), applyServiceFees, inspect('after applyServiceFees'), applyTax )(price) >Результат будет примерно таким:
priceCalculator(10) // price: undefined // after applyPercentCoupon: NaN // .Видим, price - undefined . Это произошло потому что price - третий аргумент, а мы передаем его первым.
Быстрый фикс
Сделаем так, чтобы функция принимала один объект:
const priceCalculator = (< taxPercentage = 0.3, serviceFees = 10, price, discount, percentCoupon, weight, shippingPricePerKg >) => < // . >priceCalculator(< price: 10 >) // price: 10 // after applyPercentCoupon: NaN // .Все еще получаем NaN , в этот раз потому что не был передан percentCoupon и он имеет значение undefined .
Добавим для всех параметров, кроме price , значения по умолчанию.
const priceCalculator = (< taxPercentage = 0.3, serviceFees = 10, price, discount = 0, percentCoupon = 0, weight = 0, shippingPricePerKg = 0 >) => < // . >Если запустить заново, получим результат:
priceCalculator(< price: 10 >) // 26Это пример того как композиция позволяет нам тестировать и исправлять код проще и быстрее, просто проверяя области, которые вызывают подозрения. Проблема, которую мы отлаживали, была очень простой. Когда мы переходим к более масштабным модулям, все становится еще более трудным для проверки. Большие атомарные функции трудно поддерживать. Разделение функций на более мелкие упрощает отладку, тестирование, поддержку и разработку функций.
Для чего нужна композиция?
- модульное мышление,
- тестируемость,
- возможность отладки,
- поддерживаемость.
Итоги
Композиция — это способ построения больших модулей из более мелких, что делает наш код более модульным. Таким образом, проще отлаживать, тестировать, поддерживать, повторно использовать и интереснее разрабатывать функции.
12 популярных вопросов с ответами на JavaScript собеседовании

9 месяцев назад · 4 мин. на чтение
Эта статья предназначена для junior разработчиков, которые хотят получить свою первую работу в качестве JavaScript разработчиков.
1. Что такое JavaScript и для чего он используется?
Javascript - это высокоуровневый, динамичный и интерпретируемый язык программирования, широко используемый для многих сред, таких как интерфейс веб-сайтов, backend службы, desktop и мобильные приложения. Но чаще всего JavaScript используется для создания динамических и интерактивных веб-сайтов.
2. Что такое замыкание в JavaScript?
Замыкание — это функция, которая имеет доступ к переменным своей внешней функции. Это важно, потому что это позволяет внутренней функции «запоминать» переменные из своей внешней области, поэтому она может продолжать получать к ним доступ и манипулировать ими даже после того, как внешняя функция была завершена.
function outerFunction(x) < return function innerFunction(y) < return x + y; >; > const add5 = outerFunction(5); console.log(add5(3)); // 83. Как this работает в JavaScript?
this важное ключевое слово в JavaScript. Его значение определяется тем, как вызывается функция. Его можно задать явно с помощью call() , apply() или bind() . По умолчанию его значение внутри функции устанавливается в глобальный объект (в браузере это объект window ), за исключением того, когда функция вызывается как метод объекта. В этом случае this указывает на объект, методом которого он является.
4. Что такое поднятие (hoisting) в JavaScript?
В JavaScript поднятие — это поведение, при котором переменные и объявления функций в памяти автоматически перемещаются в верхнюю часть своей области. Что это значит? Ну, это означает, что эти переменные могут быть использованы до того, как они будут объявлены, и объявления функций также могут быть вызваны до их определения.
5. В чем разница между var , let и const?
- var : Переменные, объявленные с помощью var , имеют функциональную область действия, что означает, что к ним можно получить доступ только в рамках функции, в которой они были объявлены. Внешняя переменная затеняется, когда переменная с тем же именем объявляется во вложенной функции.
- let : Пусть переменные имеют блочную область действия, что означает, что они доступны только в том блоке, в котором они объявлены. Объявление переменной с тем же именем во вложенном блоке приведет к затенению внешней переменной.
- const : переменные, объявленные с помощью const , также как let , имеют область действия блока, но их нельзя переназначить.
function example() < var x = 1; let y = 2; const z = 3; if (true) < var x = 4; let y = 5; const z = 6; >console.log(x); // 4 console.log(y); // 2 console.log(z); // 3 > example();6. Какова разница между == и === ?
Оператор равенства == выполняет принудительное приведение типа, что означает, что он попытается преобразовать операнды в один и тот же тип перед их сравнением. С другой стороны, оператор строгого равенства === , не выполняет приведение типа. Он возвращает значение true только в том случае, если оба операнда имеют одинаковый тип и значение. Например:
console.log(1 == '1'); // true console.log(1 === '1'); // false7. В чем разница между null и undefined ?
undefined указывает, что переменная была объявлена, но ей не было присвоено значение. Значение null представляет собой преднамеренное отсутствие какого-либо значения объекта. Другими словами, null — это явно заданное значение, указывающее на отсутствие значения.
8. Что такое событие в JavaScript?
В JavaScript событие — это любое действие в браузере, например нажатие пользователем кнопки, загрузка страницы или обновленный элемент. Слушатели событий обычно обрабатывают события, позволяя разработчикам указывать функции, которые должны выполняться при возникновении события. Пример:
const button = document.querySelector('button'); button.addEventListener('click', () => < console.log('Button was clicked!'); >);9. В чем разница между синхронным и асинхронным кодом в JavaScript?
Синхронный код выполняется блокирующим образом, что означает, что следующая строка кода будет выполнена после завершения текущей строки. С другой стороны, асинхронный код выполняется неблокирующим образом, что означает, что другой код может выполняться не ожидая завершения асинхронного кодом. Асинхронный код обычно реализуется в JavaScript с помощью обратных вызовов или Promises.
10. Что такое промисы (Promise) в JavaScript?
Объект Promise — это объект, представляющий успешное или неудачное завершение асинхронной операции. Promise позволяет регистрировать обратные вызовы для получения уведомлений о завершении или сбое асинхронной операции, а также обрабатывать ошибки более удобно и централизованно. Например:
const fetchData = () => < return new Promise((resolve, reject) => < setTimeout(() =>< resolve('Data fetched!'); >, 1000); >); >; fetchData() .then(data => < console.log(data); >) .catch(error => < console.error(error); >);11. Что такое обратный вызов в JavaScript?
Функция обратного вызова передается в качестве аргумента другой функции и выполняется после завершения внешней функции. Разработчики могут использовать обратные вызовы для указания кода, который будет выполняться после завершения асинхронной операции. Пример:
const fetchData = (callback) => < setTimeout(() =>< callback('Data fetched!'); >, 1000); >; fetchData(data => < console.log(data); >);12. Что такое AJAX в JavaScript?
AJAX (асинхронный JavaScript и XML) — это метод выполнения асинхронных серверных запросов с веб-страницы без перезагрузки всей страницы. AJAX позволяет разработчикам динамически обновлять веб-страницу новыми данными без необходимости обновления страницы. Это достигается путем отправки HTTP-запроса из браузера на сервер и обновления только тех частей страницы, которые требуют его с ответом. Это улучшает взаимодействие с пользователем, поскольку страница не перезагружается, а обновляются только необходимые данные. Пример:
const xhr = new XMLHttpRequest(); xhr.open('GET', 'https://api.example.com/data'); xhr.onreadystatechange = () => < if (xhr.readyState === XMLHttpRequest.DONE) < console.log(xhr.responseText); >>; xhr.send();Еще больше вопросов с собеседований можно найти здесь.
