JS код ― что куда класть
JS и HTML зачастую сильно связаны между собой. Чуть тронешь HTML – ломается JS. Что-то меняешь в JS – нужно править HTML. Усугубляется проблема тем, что JS кода и файлов со временем становится все больше. Понять, что от чего зависит и на что влияет, становится затруднительно. Есть несколько простых приемов, которые упрощают жизнь.
Не смешивать классы для JS и CSS
В html разметке можно явно указать от каких тегов зависит работа JavaScript кода. Для этого заводят классы с префиксом js- , по аналогии с CSS селекторами. Например: js-submit или js-title . Такие классы предназначены исключительно для привязки JavaScript кода, для CSS используются другие классы.
Благодаря такому приему редактировать разметку становится проще и безопаснее. Изменение визуального оформления не ломает JS.
Вставки JS в HTML
Если кода мало и он завязан на верстку — стоит разместить его непосредственно в HTML документе, оставить небольшие включения JS кода
Такая разметка и JS код не используются отдельно друг от друга. Они связаны друг с другом, удобно когда все это лежит в одном месте.
HTML документ инициализирует JS
Если JS кода много, либо он используется на разных страницах – вынести его в отдельный JS файл. Но при этом код инициализации стоит оставить на HTML странице. Например, это может быть явный вызов функции с передачей селекторов DOM дерева и прочих параметров конфигурации. Смысл в том, чтобы явно указать зависимости в HTML документе. В таком коде проще разобраться, он устойчивее.
script src="./popup.js">script> script type="text/javascript"> bind_popup('.js-popup-toggle', '.js-popup-template') script>
Шаблон разместить в теге
На стороне браузера часто используется шаблонизация. Например, для динамических модальных окон или всплывающих сообщений. Шаблонизаторов существует масса, под разные задачи и на любой вкус. Но в любом случае встает вопрос “Куда положить сам шаблон?”
Можно хранить его в виде строки JS кода. Но, как правило, это неудобно. Верстка расползается по множеству файлов, её становится сложно поддерживать.
Вариант лучше ― поместить шаблон в специальный тег в файле HTML документа:
script type="text/template" id="popup_template"> h1>Hello, !h1> p>Lorem ipsum dolor sit amet..p> script> script type="text/javascript"> var container = document.getElementById('popup_template'); var containerContent = container.textContent || container.innerText; render_template(containerContent, < username: 'Bob', >); script>
Попробуйте бесплатные уроки по Python
Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.
Переходите на страницу учебных модулей «Девмана» и выбирайте тему.
Структура кода
Начнём изучение языка с рассмотрения основных «строительных блоков» кода.
Инструкции
Инструкции – это синтаксические конструкции и команды, которые выполняют действия.
Мы уже видели инструкцию alert(‘Привет, мир!’) , которая отображает сообщение «Привет, мир!».
В нашем коде может быть столько инструкций, сколько мы захотим. Инструкции могут отделяться точкой с запятой.
Например, здесь мы разделили сообщение «Привет Мир» на два вызова alert:
alert('Привет'); alert('Мир');
Обычно каждую инструкцию пишут на новой строке, чтобы код было легче читать:
alert('Привет'); alert('Мир');
Точка с запятой
В большинстве случаев точку с запятой можно не ставить, если есть переход на новую строку.
Так тоже будет работать:
alert('Привет') alert('Мир')
В этом случае JavaScript интерпретирует перенос строки как «неявную» точку с запятой. Это называется автоматическая вставка точки с запятой.
В большинстве случаев новая строка подразумевает точку с запятой. Но «в большинстве случаев» не значит «всегда»!
В некоторых ситуациях новая строка всё же не означает точку с запятой. Например:
alert(3 + 1 + 2);
Код выведет 6 , потому что JavaScript не вставляет здесь точку с запятой. Интуитивно очевидно, что, если строка заканчивается знаком «+» , значит, это «незавершённое выражение», поэтому точка с запятой не требуется. И в этом случае всё работает, как задумано.
Но есть ситуации, где JavaScript «забывает» вставить точку с запятой там, где она нужна.
Ошибки, которые при этом появляются, достаточно сложно обнаруживать и исправлять.
Пример ошибки
Если вы хотите увидеть конкретный пример такой ошибки, обратите внимание на этот код:
alert('Hello'); [1, 2].forEach(alert);
Пока нет необходимости знать значение скобок [] и forEach . Мы изучим их позже. Пока что просто запомните результат выполнения этого кода: выводится Hello , затем 1 , затем 2 .
А теперь давайте уберем точку с запятой после alert :
alert('Hello') [1, 2].forEach(alert);
Этот код отличается от кода, приведенного выше, только в одном: пропала точка с запятой в конце первой строки.
Если мы запустим этот код, выведется только первый alert , а затем мы получим ошибку (вам может потребоваться открыть консоль, чтобы увидеть её)!
Это потому что JavaScript не вставляет точку с запятой перед квадратными скобками [. ] . И поэтому код в последнем примере выполняется, как одна инструкция.
Вот как движок видит его:
alert('Hello')[1, 2].forEach(alert);
Выглядит странно, правда? Такое слияние в данном случае неправильное. Мы должны поставить точку с запятой после alert , чтобы код работал правильно.
Это может произойти и в некоторых других ситуациях.
Мы рекомендуем ставить точку с запятой между инструкциями, даже если они отделены переносами строк. Это правило широко используется в сообществе разработчиков. Стоит отметить ещё раз – в большинстве случаев можно не ставить точку с запятой. Но безопаснее, особенно для новичка, ставить её.
Комментарии
Со временем программы становятся всё сложнее и сложнее. Возникает необходимость добавлять комментарии, которые бы описывали, что делает код и почему.
Комментарии могут находиться в любом месте скрипта. Они не влияют на его выполнение, поскольку движок просто игнорирует их.
Однострочные комментарии начинаются с двойной косой черты // .
Часть строки после // считается комментарием. Такой комментарий может как занимать строку целиком, так и находиться после инструкции.
// Этот комментарий занимает всю строку alert('Привет'); alert('Мир'); // Этот комментарий следует за инструкцией
Многострочные комментарии начинаются косой чертой со звёздочкой /* и заканчиваются звёздочкой с косой чертой */ .
/* Пример с двумя сообщениями. Это - многострочный комментарий. */ alert('Привет'); alert('Мир');
Содержимое комментария игнорируется, поэтому, если мы поместим код внутри /* … */ , он не будет исполняться.
Это бывает удобно для временного отключения участка кода:
/* Закомментировали код alert('Привет'); */ alert('Мир');
Используйте горячие клавиши!
В большинстве редакторов строку кода можно закомментировать, нажав комбинацию клавиш Ctrl + / для однострочного комментария и что-то вроде Ctrl + Shift + / – для многострочных комментариев (выделите кусок кода и нажмите комбинацию клавиш). В системе Mac попробуйте Cmd вместо Ctrl и Option вместо Shift .
Вложенные комментарии не поддерживаются!
Не может быть /*. */ внутри /*. */ .
Такой код «умрёт» с ошибкой:
/* /* вложенный комментарий . */ */ alert( 'Мир' );
Не стесняйтесь использовать комментарии в своём коде.
Комментарии увеличивают размер кода, но это не проблема. Есть множество инструментов, которые минифицируют код перед публикацией на рабочий сервер. Они убирают комментарии, так что они не содержатся в рабочих скриптах. Таким образом, комментарии никоим образом не вредят рабочему коду.
Позже в учебнике будет глава Качество кода, которая объяснит, как лучше писать комментарии.
Как работает JavaScript [Объясняю визуально]
JavaScript — один из самых любимых и в то же время ненавистных языков в мире. Его любят, потому что он мощный. Вы можете создать полнофункциональное приложение, просто изучив JavaScript и ничего более. А также его ненавидят, потому что иногда он ведет себя совершенно неожиданным образом. И это может расстроить или даже заставить вас возненавидеть его.
В этой статье я подробно объясню, как JavaScript выполняет код в браузере, и мы изучим это с помощью гифок. Прочитав эту статью, вы станете на шаг ближе к статусу рок-звезды разработки.
Контекст выполнения
«Все в JavaScript происходит внутри контекста выполнения (Execution Context)»
Было бы круто, чтобы вы запомнили эту фразу, потому что она очень важна. Скажем, что этот контекст выполнения является большим контейнером, вызываемым, когда браузер хочет запустить какой-то код JavaScript.
В этом контейнере есть два компонента: 1. Компонент памяти. 2. Компонент кода.
Компонент памяти также известен как переменная среды. В этом компоненте памяти переменные и функции хранятся в виде пар ключ-значение.
Компонент кода — это место в контейнере, где код выполняется по одной строке за раз. У этого компонента кода тоже есть необычное название, а именно «Поток выполнения» (Thread of Execution).
JavaScript — это синхронный однопоточный язык. Все потому, что он может выполнять только одну команду за раз и в определенном порядке.
Выполнение кода
Возьмем простой пример:
var a = 2; var b = 4; var sum = a + b; console.log(sum);
В этом простом примере мы инициализируем две переменные, a и b, и сохраняем 2 и 4 соответственно. Затем мы складываем значение a и b и сохраняем его в переменной суммы.
Посмотрим, как JavaScript выполнит код в браузере.
Браузер создает глобальный контекст выполнения с двумя компонентами, а именно с памятью и компонентами кода.
Браузер выполнит код JavaScript в два этапа.
- Фаза выделения памяти
- Этап выполнения кода
На этапе выделения памяти JavaScript сканирует весь код и выделяет память для всех переменных и функций в коде. Для переменных JavaScript будет хранить undefined на этапе выделения памяти, а для функций он сохранит весь код функции, который мы рассмотрим в следующем примере.
Теперь, на 2-м этапе, то есть при выполнении кода, он начинает проходить весь код построчно. Когда он встречает var a = 2, он присваивает значение 2 переменной ‘a’. До сих пор значение «а» не было определено.
То же самое и с переменной b. Он присваивает 4 переменной «b». Затем он вычисляет и сохраняет значение суммы в памяти, равное 6. Теперь, на последнем шаге, он выводит значение суммы в консоль, а затем уничтожает глобальный контекст выполнения по мере завершения нашего кода.
Как вызываются функции в контексте выполнения?
Функции в JavaScript, если сравнивать их с другими языками программирования, работают по-другому.
Возьмем простой пример:
var n = 2; function square(num) < var ans = num * num; return ans; >var square2 = square(n); var square4 = square(4);
В приведенном выше примере есть функция, которая принимает в качестве аргумента число и возвращает его квадрат.
JavaScript создаст глобальный контекст выполнения и выделит память для всех переменных и функций на первом этапе, когда мы запустим код, как показано ниже.
Что касается функций, он сохранит всю функцию в памяти.
А вот и самое интересное: когда JavaScript запускает функции, он создает контекст выполнения внутри глобального контекста выполнения.
Когда он встречает var a = 2, он присваивает значение 2 переменной ‘n’. Строка номер 2 — это функция, и поскольку функции была выделена память ранее, все сразу перейдет к строке номер 6.
Переменная square2 вызовет функцию square, а javascript создаст новый контекст выполнения.
Этот новый контекст выполнения для функции square выделит память всем переменным, присутствующим в функции на этапе выделения памяти.
После выделения памяти всем переменным внутри функции код будет выполняться построчно. Будет получено значение num, равное 2 для первой переменной, а затем вычислено ans. После вычисления ans возвратится значение, которое будет присвоено square2.
Как только функция вернет значение, она уничтожит свой контекст выполнения по завершении работы.
Теперь он будет следовать аналогичной процедуре для строки номер 7 или переменной square4, как показано ниже.
Как только весь код будет выполнен, глобальный контекст выполнения также будет уничтожен, и именно так JavaScript будет выполнять код.
Стек вызовов
Когда функция вызывается в JavaScript, JS создает контекст выполнения. Контекст выполнения будет усложняться, поскольку мы добавляем функции внутрь функции.

JavaScript управляет созданием и удалением контекста выполнения кода с помощью стека вызовов. Стек — это упорядоченный набор элементов, в котором добавление новых элементов и удаление существующих элементов всегда происходит «с одной стороны». Первый элемент, добавленный в стек, будет удален оттуда последним. Этот принцип называется FILO.
Стек вызовов — это механизм, позволяющий отслеживать свое место в скрипте, вызывающем несколько функций.
function a() < function insideA() < return true; >insideA(); > a();
Мы создаем функцию «a», которая вызывает другую функцию «insideA», которая возвращает значение true. Я знаю, что код бессмысленный и ничего не делает, но он поможет нам понять, как JavaScript обрабатывает коллбеки (функции обратного вызова).
JavaScript создаст глобальный контекст выполнения. Глобальный контекст выполнения выделит память для функции ‘a’ и вызовет ‘function a’ на этапе выполнения кода. Контекст выполнения создается для функции a, которая размещается над глобальным контекстом выполнения в стеке вызовов.
Функция a назначит память и вызовет функцию insideA. Контекст выполнения создается для функции insideA и помещается над стеком вызовов ‘function a’. Теперь эта функция insideA вернет true и будет удалена из стека вызовов. Поскольку внутри ‘function a’ нет кода, контекст выполнения будет удален из стека вызовов.
Наконец, глобальный контекст выполнения также удаляется из стека вызовов.
- js
- как работает javascript
Код JavaScript: примеры. JavaScript-гайд
Предлагаем вашему вниманию основные концепции языка программирования JavaScript, сопровождаемые примерами кода.
Немного истории
Язык программирования JavaScript появился более 20 лет назад и прошёл за этот период времени довольно большой путь. Когда-то он был скромным инструментом для создания простых анимаций. Сегодня он регулярно попадает в топ-10 рейтинга Tiobe.
Итак, JavaScript — это язык, имеющий высокий уровень абстракции, что даёт возможность сосредоточить своё внимание на коде, а не на низкоуровневой программной реализации. JS имеет слабую динамическую типизацию, поддерживая при этом разные парадигмы программирования.
JavaScript реализует стандарт ECMAScript, в результате чего название версий начинается ES: ES6, ES2018 и т. п. Версии нумеруются по году релиза и имеют порядковый номер. За развитие JavaScript отвечает комитет TC39, причём каждая новая функциональность должна пройти несколько этапов перед её принятием.
Стайлгайды для JavaScript-кода
Существуют соответствующие стайлгайды (от английского словосочетания Style Guide). Они необходимы для того, чтобы код на JavaScript был аккуратным и чистым. По сути, речь идёт о выработанной системе соглашений, которой придерживаются программисты в процессе разработки кода. Среди готовых стайлгайдов можно упомянуть системы соглашений от Google либо AirBnb.
Примеры переменных в JavaScript-коде
Имена функций и переменных в JS должны начинаться с буквы, символа подчёркивания либо $. Кроме того, могут содержаться даже иероглифы либо эмодзи! Что касается идентификаторов, то они регистрозависимы: otus и OTUS – это разные переменные.
Также нельзя применять в качестве имен зарезервированные слова:

Чтобы создать переменную, следует использовать одно из 3-х ключевых слов: let, var либо const.

Какие тут нюансы: • var-переменные обладают свойством хойстинга (поднятия) и имеют контекстную область видимости; • let и const имеют блочную видимость и не поднимаются; • неизменяемость const-переменных повсеместно применяются для обеспечения иммутабельности.
Примеры выражений в JavaScript-коде
Выражениями называют структурные единицы кода, которые можно как вычислить, так и преобразовать в значение.

Примитивные типы данных в коде JavaScript
Все числа в JS, включая целые, имеют тип float. Что касается строк, то они представляют собой последовательность символов в двойных либо одинарных кавычках, при этом принципиальной разницы между кавычками нет.

Если нужно выполнить конкатенацию строк, подойдёт оператор + :
"Otus " + "courses"Мы можем заполнить строку символами до определенной длины, сделав это как с начала, так и с конца:
Уже начиная с версии ES6, для создания строк появился новый синтаксис, который допускает многострочность и интерполяцию выражений:
Примеры логических значений в коде JavaScript
Логические значения false и true применяются в сравнениях, циклах и условиях. Остальные типы данных можно приведены к логическому значению.
Кроме того: — null значит, что у переменной нет значения. Собственно говоря, такая концепция есть не только в JavaScript, но и в других языках программирования (nil, None); — undefined значит, что у переменной нет значения, то есть она не инициализирована.
Кстати, функции без директивы return вернут именно undefined. Являются undefined и неинициализированные параметры функций.
Примеры функций в коде на JavaScript
Под функцией понимают самостоятельный блок кода на JavaScript, который можно применять в программе повторно. Функции можно вызывать, а также передавать им аргументы и получать новое значение.
Согласно концепции языка программирования JavaScript, функции — это объекты, а значит, могут иметь свои методы и свойства. Кроме того, функция может как быть аргументом либо возвращаемым значением другой функции, так и быть помещённой в переменную.
Начиная с версии ES6, функции в JavaScript поддерживают дефолтные параметры:
Причём в списке параметров мы можем оставлять замыкающую запятую:
Что касается возвращаемого значения, то по умолчанию все функции в JavaScript возвращают undefined, однако посредством директивы return мы можем вернуть единичное значение любого типа.
Отдельного упоминания заслуживают замыкания. Их эффект основан на том, что области видимости в JS ограничены функциями. Но это тема отдельного разговора.
Идём дальше. Когда функция определена как свойство какого-либо объекта, её называют методом этого объекта, а функция может ссылаться непосредственно на сам объект, используя ключевое слово this.
Кстати, this мы можем установить искусственно посредством методов apply, call, bind:
Когда функцию вызывают не в контексте объекта, то её this равняется undefined.
Стрелочные функции
Они появились в ES6, полностью изменив вид JavaScript-кода. Давайте рассмотрим это на примере, ведь на первый взгляд они довольно просты:
Но тут существуют нюансы. К примеру, у стрелочных функций нет своего this, а получают они его из контекста создания.
IIFE и генераторы
Immediately Invoked Function Expressions – это функции, выполняемые сразу после объявления.
Что касается генераторов, то это особенные функции. Мы можем приостановить их работу посредством ключевых слов yield и возобновить позже. В результате мы получаем возможность использовать совершенно новые концепции программирования на JavaScript. Посмотрим на пример кода ниже:
Массивы и объекты в JavaScript
Массивы дают возможность организовывать несколько разных элементов в коллекцию, предоставляя много удобных методов для работы.
Что касается объектов, то в ES2015 объектные литералы получили ряд новых возможностей: — упрощение синтаксиса включения переменных:
— прототипы и ключевое слово super:
— динамические имена свойств:
На следующем примере JavaScript-кода можно увидеть, как получить ключи и значения объекта:
Примеры циклов в коде на JavaScript
Начнём с for:
Теперь посмотрим на пример кода с for-each:
Далее do-while:
Естественно, не забудем и про while:
Теперь for-in:
Что касается for-of, то этот цикл успешно сочетает в себе лаконичность метода массивов forEach и возможность прерывания цикла:
Что же, на этом всё. Если же вас интересуют продвинутые курсы по JavaScript, милости просим!






















