Вы когда-нибудь задумывались, что происходит с переменной, когда к ней обращаются еще до ее объявления в javascript?
Что ж… Я уверен, вы уже догадались… Ему присваивается значение undefined
и он имеет тип undefined
.
Предположим, вы не объявили ни одной переменной с именем xyz
. Если вы попытаетесь использовать эту переменную, во время выполнения будет выдано исключение.
console.log(xyz); //ReferenceError: xyz is not defined
Но подождите…
Почему, когда вы пытаетесь получить доступ к переменной до ее объявления, Exception(ReferenceError) не генерируется? Вместо этого ему присваивается значение undefined.
Это из-за этого механизма в javascript, который называется Подъем.
Подъем – это механизм, в котором объявления переменных и функций поднимаются до верхней части своей области, в которой они объявлены, перед выполнением кода.
Итак, в глобальной области следующий код
console.log(xyz); // Undefined var xyz=“Trying to hoist the variable”.
будет внутренне означать:
var xyz; //Assigned undefined & is of type undefined console.log(xyz); xyz=“Trying to hoist the variable”;
То же поведение в случае области действия функция
function hoist() { console.log(abc); //undefined console.log(xyz); //undefined var xyz=“I will be added to the function scope”; abc=“I will be added to the global scope”; } hoist(); console.log(abc); //“I will be added to the global scope" console.log(xyz); //ReferenceError: xyz is undefined
Если внимательно присмотреться, переменная abc
по-прежнему доступна за пределами области действия функции. Это связано с тем, что переменная abc не объявлена с ключевым словом var
.
Таким образом, ключевое слово var
определяет область действия переменной. Поскольку переменная abc
объявлена без ключевого слова var
, она добавляется в глобальную область видимости и доступна везде.
Строгий режим
Если вы не можете допустить использование переменной до ее объявления... не беспокойтесь... Вы можете использовать строгий режим Javascript.
Просто предварите файл кода следующим:
‘use strict’;
Предупреждение. Строгий режим работает по-разному в разных браузерах.