Страницы

Поиск по вопросам

понедельник, 9 декабря 2019 г.

Какая разница между объявлениями глобальных переменных с var и без?

#javascript


Допустим есть код:  

// вне всяких блоков и функций
var a1 = 'Something';
a2 = 'Something';


1) В чём будет разница между переменные a1 и a2?
2) Является ли вообще a2 переменной?
3) Где-нибудь можно использовать второй вариант?
    


Ответы

Ответ 1



В чём будет разница между переменные a1 и a2? В режиме strict вариант без var будет сломан: 'use strict'; var a1 = 'Something'; a2 = 'Something'; // Uncaught ReferenceError: a2 is not defined Является ли вообще a2 переменной? Разумеется, а чем же ещё? Где-нибудь можно использовать второй вариант? Это дело каждого, но смысла в этом немного. Гораздо лучше явно обозначать глобальный объект(ака window.a2 = 42;). Ещё лучше - не засорять глобальный scope совсем.

Ответ 2



1) В старом стандарте можно было работать и без var, просто присвоив значение. С "use strict" уже нельзя. 2) Да, является: Присвоение значения необъявленной переменной подразумевает, что она будет создана как глобальная переменная (переменная становится свойством глобального объекта) после выполнения присваивания значения. Т. е. до присвоения её нет и будет ошибка при обращении до присвоения; а вот с var переменная инициализируется до выполнения текущего блока. 3) Можно. Но нужны ли описанные выше проблемы? Подробнее, много полезного: javascript.ru, MDN.

Ответ 3



Это скорее не ответ, а комментарий к ответу выше. (Комментарии мне пока не доступны, пардон) 1.Если обратиться к объявленной переменной до присваивания ей значения, на выходе получите undefined, в случае с необъявленной - ReferenceError. Это происходит, потому что переменная а1 уже объявлена и существует, переменная а2 соответсвенно не объявлена и не существует. console.log(a1); console.log(a2); var a1 = 'Something'; a2 = 'Something'; Является. Можно, но смысла в этом никакого.

Ответ 4



Переменная объявленная без var (или let или const) попадает в глобальный объект: (function(){ var a = 1; b = 2; })(); console.log(b); console.log(a);

Комментариев нет:

Отправить комментарий