Предварительные требования: необходимо иметь представление о контексте выполнения javascript
Javascript несколько странен, когда дело доходит до того, как генерируется его контекст выполнения, и это привело разработчиков в некоторое замешательство. Это был долгий путь для javascript, и пришло время реализовать некоторые передовые концепции, чтобы мы могли выбраться из страданий, в которых мы находимся. Теперь, как разработчик внешнего интерфейса, я всегда был сбит с толку тем, как код выполняется для некоторых степень. Возьмем самую популярную тему про javascript и попытаемся понять, что же это такое на самом деле.
Подъем?
Все ребята, которые занимаются разработкой javascript, слышали это слово в какой-то момент своей карьеры. Подъем, передовая концепция, которая в какой-то момент нашей жизни смутит всех нас. Что ж, давайте углубимся в это понятие. Сначала посмотрите на сегмент кода и решите, что он выведет!
var variable_one = "Executing variable_one";
function f1(){
console.log('executing f1 function');
}
f1();
console.log(variable_one);
Как вы и предполагали, этот код приведет к следующему выводу консоли.
executing f1 function Executing variable_one
Теперь давайте немного изменим сегмент кода и проверим, что получится на выходе.
f1();
console.log(variable_one);
var variable_one = "Executing variable_one";
function f1(){
console.log('executing f1 function');
}
Теперь это приведет к выводу как таковому.
executing f1 function undefined
Обратите внимание, что вывод изменился с первого на второй.? Если мы изменим приведенный выше код и удалим объявление variable_one, это вызовет ошибку как таковую.
Uncaught ReferenceError: переменная_on не определена
Что ж, в javascript контекст выполнения изначально считывает весь код и создает необходимые выделения памяти для требуемых переменных, таким образом создавая заполнители для каждой из переменных/функций, с которыми сталкивается компилятор. Контекст выполнения виртуальной машины javascript выделяет место в памяти для каждой имеющейся у нее переменной, и если она выполняется до присвоения значения, она показывает, что значение переменной не определено.
Разработчики часто неправильно понимают это и думают, что все переменные определяются в верхней части кода самой виртуальной машиной, в то время как на самом деле происходит то, что виртуальная машина создает ячейки памяти для переменных, с которыми она сталкивается.