Найти в Дзене
Рекурсия для чайников
Вы когда-нибудь смотрели в зеркало, которое стоит напротив другого зеркала? Там бесконечная глубина - отражение отражения отражения. Вот это и есть рекурсия. Только в программировании мы обычно не хотим бесконечности (иначе сервер упадет). Мы хотим, чтобы функция углублялась ровно столько раз, сколько нужно, а потом аккуратно возвращалась обратно - как матрешка, которая раскрывается до последней куклы, а затем собирается снова. Прежде чем писать код, ответьте себе на три вопроса (они спасут от stack overflow): Если эти три пункта есть - рекурсия безопасна...
4 дня назад
Big O нотация на пальцах: Почему ваш код — это велосипед, а не ракета
Big O нотация на пальцах: Почему ваш код - это велосипед, а не ракета Представьте, что вы пришли на кухню. Вам нужно пожарить 10 котлет. На сковороду влезает только 2 штуки, а время жарки одной стороны - 5 минут. Как бы вы ни крутили, вы потратите одно и то же время. А теперь представьте, что котлет 1000. Или миллион. Вот тут-то и появляется главный вопрос программиста: Как изменится время работы, если данных станет сильно больше? Этот вопрос и решает Big O нотация (читается «О большое»). Это не магия, это просто способ сказать: «Слушай, когда у меня будет миллион пользователей, этот код ляжет...
4 дня назад
Язык JavaScript - Флаги и дескрипторы свойств
Вы думаете, что свойство объекта - это просто пара "ключ-значение"? Что ж, это только верхушка айсберга. Под поверхностью скрывается целый мир: флаги, которые определяют, можно ли свойство изменять, перечислять или удалять. Дескрипторы, которые позволяют создавать вычисляемые свойства с геттерами и сеттерами. В JavaScript каждое свойство объекта - это не просто значение. Это структура с тремя скрытыми флагами и, возможно, функциями доступа. Понимание этой системы открывает двери к продвинутому метапрограммированию, созданию неизменяемых объектов и тонкому контролю над API...
2 недели назад
Язык JavaScript - Повторяем стрелочные функции
Когда в 2015 году в JavaScript появились стрелочные функции, многие вздохнули с облегчением. Наконец-то можно писать короткие колбэки без function и return. Наконец-то this перестал быть проклятием. Наконец-то код стал красивее. Но, как у любой суперсилы, у стрелочных функций есть тёмная сторона. Они не везде подходят. Они ведут себя иначе. И если не понять эти различия, стрелка может выстрелить мимо цели. Сегодня мы повторим всё, что нужно знать о стрелочных функциях: от синтаксиса до подводных камней, от идеальных сценариев до тех мест, где они категорически не подходят...
2 недели назад
Язык JavaScript - Привязка контекста к функции
Вы когда-нибудь теряли ключи в собственной квартире? Вроде только что держали в руках, а через секунду - исчезли. И вы ходите, ищете, а они лежат на самом видном месте, просто вы смотрели не туда. С this в JavaScript та же история. Вы только что им пользовались, всё работало. А потом передали метод в колбэк - и this потерялся. И вы ищете, отлаживаете, добавляете console.log, а проблема в том, что функция забыла, кому она принадлежит. Сегодня мы разберёмся, почему this теряется, как его привязать намертво и какие есть способы зафиксировать контекст...
2 недели назад
Язык JavaScript - Декораторы и переадресация вызова, call/apply
Представьте, что у вас есть функция. Она делает своё дело. Но вам нужно добавить логирование. Или кэширование. Или проверку прав доступа. Или замер времени выполнения. Вы можете переписать функцию, добавив туда новый код. Но что, если функций много? Что, если вы не можете менять оригинал? Что, если вам нужно применить одно и то же улучшение к разным функциям? Встречайте декораторы - мощный паттерн, который позволяет оборачивать функции, добавляя им новое поведение без изменения исходного кода. А...
2 недели назад
Язык JavaScript - Планирование: setTimeout и setInterval
Вы когда-нибудь задумывались, как JavaScript выполняет код "через 5 секунд", если он однопоточный? Или почему setTimeout(fn, 0) не выполняется мгновенно? Или как остановить бесконечный интервал, который уже запущен? Добро пожаловать в мир асинхронного планирования. setTimeout и setInterval - это два кита, на которых держится отложенное выполнение в JavaScript. Они кажутся простыми: "запланируй эту функцию на потом". Но за этой простотой скрывается Event Loop, макрозадачи и множество подводных камней...
2 недели назад
Язык JavaScript - Синтаксис "new Function"
Вы знаете несколько способов создать функцию. Function Declaration, Function Expression, стрелочные функции. Но есть ещё один. Тёмный. Мощный. Опасный. Встречайте конструктор Function. Он позволяет создавать функции из строк. Да, прямо из строк, которые могут быть сгенерированы динамически, прийти с сервера или быть введены пользователем. Это звучит как суперсила. И это действительно суперсила. Но с такой силой приходит не просто ответственность - приходит опасность. new Function - это дверь в мир eval-подобных проблем: уязвимости безопасности, проблемы с производительностью и нечитаемый код...
2 недели назад
Язык JavaScript - Объект функции, NFE
Вы думаете, что функция - это просто "кусочек кода, который можно вызвать"? Вы ошибаетесь. В JavaScript функция - это гражданин первого класса, объект высшего порядка, который можно присвоить переменной, передать как аргумент, вернуть из другой функции... и даже добавить к нему свойство. Да, вы не ослышались. У функций есть свойства. Как у обычных объектов. Сегодня мы разберём двойственную природу функций: с одной стороны - вызываемая конструкция, с другой - полноценный объект. И заодно познакомимся...
3 недели назад
Язык JavaScript - Глобальный объект
Представьте, что у вас есть гигантская коробка. Вы можете положить в неё что угодно, и это что-то станет доступным отовсюду - из любой комнаты, любого ящика, любого уголка вашего кода. Эта коробка существует всегда. Она появляется вместе с программой и исчезает только когда программа завершается. Это глобальный объект. Он всегда рядом. Он хранит console, setTimeout, Math и все ваши глобальные переменные. Но с великой силой приходит великая ответственность. Засорить глобальный объект - значит создать потенциальный ад для отладки...
3 недели назад
Язык JavaScript - Устаревшее ключевое слово "var"
Если вы откроете любой учебник JavaScript десятилетней давности, вы увидите его. Он везде: в циклах, в функциях, в глобальном пространстве. var был королём переменных. Но времена изменились. В 2015 году в мире JavaScript произошла революция. Появились let и const, и старый добрый var внезапно стал... опасным. Не потому, что он сломался. Он работает как работал. Просто мы поняли, что его поведение - это источник багов, а не фича. Сегодня мы разберём, почему var - это анахронизм, какие проблемы он создаёт и почему вы должны использовать let и const всегда...
3 недели назад
Язык JavaScript - Область видимости переменных, замыкание
Вы когда-нибудь задумывались, почему переменная, объявленная внутри функции, не видна снаружи? Или почему функция "запоминает" переменные из внешней функции даже после того, как та завершила работу? Добро пожаловать в мир областей видимости и замыканий - фундаментальных концепций, которые делают JavaScript таким гибким и мощным. Это не просто теория. Это знание, которое отделяет новичка, случайно создающего глобальные переменные, от профессионала, пишущего чистый, предсказуемый и эффективный код...
3 недели назад