Переменные
Давайте для начала представим, что переменные это коробочки с именами. В дальнейшем мы можем обращаться по этому имени(идентификатору) и получать значение из этой коробочки. Операция создания переменной называется объявлением. Для того чтобы изменить значение переменной мы соответственно используем оператор назначения(=).
Переменная – это «именованное хранилище» для данных. Мы можем использовать переменные для хранения товаров, посетителей и других данных. Определение с learn.javascript.ru
Переменные объявляются с помощью операторов:
var- объявление переменной в старом стиле.let- объявление мутабельной(изменяемой) переменной в стилеEcmaScript 2015 +const- объявление константы в стилеEcmaScript 2015 +
Имена переменных
На имя переменной в JavaScript наложены всего три ограничения.
- Имя может состоять из: букв, цифр, символов
$и_ - Первый символ не должен быть цифрой.
- Имя не может быть таким же как одно из ключевых слов(операторы)
break,case,catch,continue,debugger,default,delete,do,else,false,finally,for,function,if,in,instanceof,new,null,return,switch,this,throw,true,try,typeof,var,void,while,with
Осторожно!
Будьте аккуратнее, не переопределяйте глобальные переменные, это приводит к ошибкам.
Например... Существует глобальная переменная alert(функция), это функция которая выводит текстовое сообщение в окне браузера. Если вы будете невнимательны вы можете переопределить ее и получить неожиданное поведение.
Тренировочка
Какое имя разрешено, а какое нет?
let/const
В EcmaScript 2015 появились новые способы объявления переменных - ключевые слова let и const. Как я уже указал выше, ключевое слово let предназначено для объявления мутабельной(изменяемой) переменной, а с помощью const вы можете объявлять иммутабельные переменные(константы).
Всплытие переменных(hoisting)
Переменные, объявленные через ключевое слово var подвержены так называемому всплытию. Это значит, что объявление переменной как бы перемещается вверх в рамках всего файла или функции в которой она объявлена.
Код написанный выше будет эквивалентен следующему:
Как видите, объявление переменной переместилось вверх, но присваение значения осталось на предыдущем месте.
Совет
Принято не использовать переменные в коде, если они еще не объявлены. А вообще следует объявлять переменные в начале функции или файла.
В новом стандарте. Если переменная объявлена через let или const всплытие не произойдет.
Константы
Константа – это переменная, которая никогда не меняется. Как правило, их называют большими буквами, через подчёркивание. Например:
Обратите внимание
То что константы называют большими буквами - это достаточно популярное соглашение между развработчиками в различных языках программирования. Это было особенно полезно, в те времена когда не существовало ключевого слова const для объявления неизменяемой переменной. В те времена мы объявляли фактически мутабельные переменные и обозначали их формальную неизменяемость с помощью написания их "капсом".
Области видимости переменных
Область видимости переменной определяет контекст, в котором доступны переменные и функции, на которые можно ссылаться в программе. Область видимости определяет видимость и время жизни переменных и параметров. Если переменной нет в определенной области видимости, то она недоступна для использования. Области видимости также могут располагаться в иерархическом порядке, чтобы дочерние имели доступ к родительским, а не наоборот.
Переменные в Javascript бывают глобальными и локальными. Глобальная переменная доступна везде, локальная — только в текущей области видимости.
Начиная с EcmaScript 2015 локальная область видимости разбилась на 2 части:
Функциональная- Область видимости переменной в рамках функции.function foo() {var bar = "bar";function baz() {console.log(bar);}}note
Я выделил строки в которых переменная
barдоступна.Переменная
barбудет локальной в рамках функцииfooи в рамках дочерней функциональной области (функцииbaz).Блочная- Локальная область видимости в рамках блока(между фигурных скобок{})C появлением новых инструкций объявления переменных
letиconst, появился новый тип скоупа. Начиная сEcmaScript 2015мы можем объявлять локальные переменные в рамках блока. Думаю что по примеру будет понятно:function foo() {{let bar = "bar";console.log(bar); // Здесь переменная bar доступна}console.log(bar); // А здесь уже нет!}note
Я выделил строки в которых переменная
barдоступна.
Ограничение видимости переменных
Глобальные переменные - это ЗЛО. Почему? Ну все просто.. зачем вам глобальная переменная, которая может случайно конфликтовать с какой-нибудь другой переменной в какой-нибудь библиотеке.. даже не в вами написанном коде. Мы достаточно легко можем представить что у вас есть глобальная переменная.
TODO
Дописать
Дополнительные материалы
Есть некоторая проблема для в понимании как связан стек вызовов и области видимости переменных(скоупы). Вот хорошая статья, которая должна это объяснить: