Как работает 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 в Visual Studio Code
03 марта 2023
Оценки статьи
Еще никто не оценил статью
Иногда возникает необходимость запустить фрагмент кода JavaScript напрямую в Visual Studio Code (VSCode), чтобы проверить его работоспособность. В этой статье мы рассмотрим, как запустить код JavaScript в VS Code.
Установка Node.js на компьютер
Первым шагом для запуска JavaScript в VS Code является установка Node.js.
Node.js — это среда выполнения JavaScript, которая позволяет запускать JavaScript на стороне сервера.
Она включает в себя средства для выполнения JavaScript кода в командной строке, которые можно использовать для тестирования и отладки JavaScript кода.
Вы можете загрузить и установить Node.js с официального сайта по ссылке
Создайте файл JavaScript в VS Code
После установки Node.js вы можете создать файл JavaScript в VS Code.
Чтобы создать новый файл JavaScript, выберите File -> New File в меню VS Code. Затем сохраните файл с расширением .js (например, index.js).
Напишите JavaScript код
После создания файла JavaScript вы можете написать код, который хотите запустить. Например, давайте создадим новый массива на основе существующего массива с помощью map() :
let numbers = [1, 2, 3, 4, 5]; let squares = numbers.map(num => num ** 2); console.log(squares);
Запустите код
Теперь мы готовы запустить наш JavaScript код. Чтобы запустить код, выберите Terminal -> New Terminal в меню VS Code, чтобы открыть новую вкладку терминала. В терминале введите следующую команду: node index.js
где index.js — это имя файла, который вы создали ранее.
После выполнения этой команды вы увидите вывод в консоли:
>>> [ 1, 4, 9, 16, 25 ]

Это означает, что ваш JavaScript код успешно запущен в VS Code!
Вы можете также использовать VS Code для отладки JavaScript кода, используя встроенные средства отладки. Для этого вам нужно создать конфигурационный файл отладки (launch.json) и настроить его для запуска и отладки вашего JavaScript кода.
В заключение, запуск JavaScript кода в VS Code — это очень простой процесс, который можно выполнить всего за несколько шагов.
Установите Node.js, создайте файл JavaScript, напишите код и запустите его в терминале VS Code. Вы можете использовать этот процесс для разработки и отладки JavaScript приложений в VS Code.
Меню категорий
-
Загрузка категорий.
Как выполнить код javascript

PIX Studio
PIX Runner
PIX Master
Примеры роботов
Базовые активности
Active Directory
Буфер обмена
Windows credential
Клавиатура
Google Диск
Google Таблицы
Google Документы
Office — Excel общие
Office — Excel
Office — Outlook
Office — Word
Office — Excel interop
Процессы Windows
PIX Master (активности в PIX Studio)
Мессенджеры.Telegram
Переходите на новый сайт Базы знаний. Актуализация контента происходит теперь там.
WEB — ВЫПОЛНИТЬ КОД JAVASCRIPT
Активность «Выполнить код JavaScript» находится в разделе «Web» рабочей области «Активности» .
Активность предназначена для выполнения произвольного JavaScript-кода на странице браузера. Код JavaScript передаётся в виде строки.
Обратите внимание, ошибка, возникшая при выполнения кода JavaScript приведет к ошибке в скрипте.
eval()
Предупреждение: Выполнение кода JavaScript с текстовой строки — это невероятный риск для безопасности. Злоумышленнику слишком легко запустить какой угодно код, когда вы используете eval() . Смотрите Никогда не используйте eval()!, ниже.
Метод eval() выполняет JavaScript-код, представленный строкой.
Интерактивный пример
Синтаксис
eval(string)
Параметры
Строка, представленная JavaScript выражением, оператором или последовательностью операторов. Выражение может содержать переменные и свойства существующих объектов.
Возвращаемое значение
Возвращает значение выполнения кода, переданного в функцию в виде строки. Если код не возвращает ничего — будет возвращено значение undefined .
Описание
eval() — функция глобального объекта.
Аргумент функции eval() — строка. eval() исполняет содержащееся в строке выражение, один или несколько операторов JavaScript. Не стоит вызывать eval() для определения значения арифметического выражения; JavaScript вычисляет их автоматически.
eval() можно использовать для вычисления значения арифметического выражения, записанного в строковом виде, на более поздней стадии исполнения. Предположим, существует переменная x . Можно отложить вычисление выражения, в котором содержится х , если присвоить переменной это выражение в виде строки (допустим, » 3 * x + 2 «), а затем вызвать eval() в более поздней точке кода.
Если аргумент, переданный eval() , не является строкой, eval() возвращает его неизменным. В следующем примере определён конструктор String , и eval() не вычисляет значение выражения, записанного в строковом виде, а возвращает объект типа String .
eval(new String("2 + 2")); // возвращает объект типа String, содержащий "2 + 2" eval("2 + 2"); // возвращает 4
Это ограничение легко обойти при помощи toString() .
var expression = new String("2 + 2"); eval(expression.toString());
Если вы используете eval косвенно, вызовом его через ссылку, а не просто eval , в ECMAScript 5 это работает в глобальной области видимости, а не в локальной; это значит, что eval будет вызван в глобальной области видимости, а код будет выполнен с отсутствием доступа к локальным переменным в пределах области видимости, где он был вызван.
function test() var x = 2, y = 4; console.log(eval("x + y")); // Прямой вызов, использует локальную области видимости, результат - 6 var geval = eval; console.log(geval("x + y")); // Непрямой вызов, использует глобальную область видимости, бросит ReferenceError, т.к. `x` - не определён >
Не используйте eval без необходимости!
eval() — опасная функция, которая выполняет код, проходящий со всеми привилегиями вызывателя. Если вы запускаете eval() со строкой, на которую могут влиять злоумышленники, то вы можете запустить вредоносный код на устройство пользователя с правами вашей веб-страницы/расширения. Наиболее важно, код третьей стороны может видеть область видимости, в которой был вызван eval() , что может может привести к атакам, похожим на Function .
Также eval() , как правило, медленнее альтернатив, так как вызывает интерпретатор JS, тогда как многие другие конструкции оптимизированы современными JS движками.
Есть безопасные (и быстрые!) альтернативы eval() для общих случаев использования.
Доступ к свойствам
Вам не следует использовать eval() , чтобы конвертировать имена свойств в свойства. Рассматривая следующий пример, где свойство объекта используемое для доступа неизвестно до выполнения кода. Это можно сделать с eval:
var obj = a: 20, b: 30 >; var propname = getPropName(); // возвращает "a" или "b" eval("var result = obj." + propname);
Однако, eval() здесь не нужен. По факту, использование здесь его удивляет. Вместо него используйте доступ к свойствам, который быстрее и безопаснее:
var obj = a: 20, b: 30 >; var propname = getPropName(); // возвращает "a" или "b" var result = obj[propname]; // obj[ "a" ] то же, что и obj.a
Используйте функции вместо исполнения фрагментов кода
У JavaScript функции первого класса, что значит, что вы можете передавать функции как аргументы, хранить их в переменных или свойствах объектов и так далее. Многие DOM API созданы с учётом этого, так что вы можете (и вам следует) писать:
// вместо setTimeout(" . ", 1000) : setTimeout(function() . >, 1000); // вместо elt.setAttribute("onclick", ". ") использовать: elt.addEventListener("click", function() . > , false);
Замыкания также полезны как способ создания функций с параметрами без конкатенации строк.
Разбор JSON (конвертирование строк в JavaScript объекты)
Если строка, переданная в eval() , содержит данные (к примеру, массив: «[1, 2, 3]» ), а не код, вам следует рассмотреть JSON, позволяющий строке использовать подмножество JavaScript синтаксиса для представления данных. Смотрите также: Загрузка JSON и JavaScript в расширениях.
Заметьте, что синтаксис JSON ограничен в сравнении с JavaScript синтаксисом, многие валидные JavaScript литералы не распарсятся в JSON. К примеру, лишние запятые в конце выражений не разрешены в JSON, а имена свойств (ключи) в объектах должны быть в двойных кавычках. Будьте уверены использовать сериализацию JSON для создания строк, которые потом будут разбираться как JSON.
Передавайте данные вместо кода
К примеру, расширение, созданное изменять содержимое веб-страниц, должно иметь правила, определённые в XPath (en-US) , а не JS коде.
Выполняйте код с ограниченными правами
Если выполнять код всё-таки необходимо, желательно это делать с уменьшенными привелегиями. Этот совет подходит, главным образом, к расширениям и XUL приложениям, которые могут использовать Components.utils.evalInSandbox.
Примеры
Использование eval
В следующем коде оба выражения содержат eval() , возвращающий 42. Первое определяется строкой » x + y + 1 «; второе — строкой » 42 «.
var x = 2; var y = 39; var z = "42"; eval("x + y + 1"); // возвращает 42 eval(z); // вернёт 42
Использование eval для исполнения строки, содержащей операторы JavaScript
Следующий пример использует eval() для получения значения выражения str . Эта строка состоит из JavaScript выражений, печатающих в консоль, и, если x равен пяти, призывающих z значение 42, или 0 в противном случае. Когда второе выражение будет исполнено, eval() будет считать выражения выполненными, а также это установит значение выражению переменной z и вернёт его.
var x = 5; var str = "if (x == 5)else z = 0; " ; console.log("z is ", eval(str));
Последнее выражение выполняется
eval() вернёт значение последнего выполняемого выражения
var str = "if ( a ) < 1+1; >else < 1+2; >"; var a = true; var b = eval(str); // вернёт 2 console.log("b is : " + b); a = false; b = eval(str); // вернёт 3 console.log("b is : " + b);
eval как строковое определение функции, включающее «(» и «)» как префикс и суффикс
var fctStr1 = "function a() <>"; var fctStr2 = "(function a() <>)"; var fct1 = eval(fctStr1); // вернёт undefined var fct2 = eval(fctStr2); // вернёт функцию
Спецификации
| Specification |
|---|
| ECMAScript Language Specification # sec-eval-x |
Поддержка браузерами
BCD tables only load in the browser
Gecko-специфичные замечания
- Исторически eval() имел второй необязательный аргумент, указывающий на то, в контексте какого объекта будет выполняться выражение. Этот аргумент не был стандартизован и был удалён из SpiderMonkey в Gecko 1.9.1 (Firefox 3.5). См. баг 442333.
Смотрите также
Found a content problem with this page?
- Edit the page on GitHub.
- Report the content issue.
- View the source on GitHub.
This page was last modified on 7 авг. 2023 г. by MDN contributors.
Your blueprint for a better internet.
MDN
Support
- Product help
- Report an issue
Our communities
Developers
- Web Technologies
- Learn Web Development
- MDN Plus
- Hacks Blog
- Website Privacy Notice
- Cookies
- Legal
- Community Participation Guidelines
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998– 2023 by individual mozilla.org contributors. Content available under a Creative Commons license.
