1. Объявления Var и поднятие

Объявления переменных с использованием var обрабатываются так, как будто они находятся в верхней части функции, это называется подъемом. В качестве примера того, что делает подъем, рассмотрим следующую функцию:

function myFun(condition) {
    if (condition) {
        var value = 123;
        return value;
    } else {
        // statement
    }
        // value exists here with a value of undefined
}

2. Объявления на уровне блоков

Объявления на уровне блока — это те, которые объявляют переменные, недоступные за пределами заданной области блока. Блочные области создаются:

  1. Внутри функции
  2. Внутри блока (обозначается символами { и })

Введение объявлений на уровне блоков в ECMAScript 6 призвано обеспечить такую ​​же гибкость (и единообразие) в JavaScript.

3. Пусть объявления

ES2015 представил важные новые ключевые слова JavaScript: let. let — область действия на уровне блока. var создал конфликт, когда была написана огромная строка кода, чтобы избежать этого конфликта. ES1015 ввел let. когда мы инициализируем любую переменную с помощью let keyward, мы не можем получить доступ за пределы блока

function getValue(condition) {
    if (condition) {
        let value = "blue";
        // other code
        return value;
    } else {
        // value doesn't exist here
        return null;
    }
    // value doesn't exist here
}

4. Без повторной декларации

Если идентификатор уже был определен в области, то использование идентификатора в объявлении Let внутри этой области приведет к возникновению ошибки. Например:

var count = 30;
// Syntax error
let count = 40;

5. Объявления констант

Вы также можете определить переменные в ECMAScript 6 с синтаксисом объявления const. Переменные, объявленные с помощью const, считаются константами, то есть их значения нельзя изменить после установки. По этой причине каждая переменная const должна быть инициализирована при объявлении, как показано в этом примере:

// Valid constant
const maxItems = 30;
// Syntax error: missing initialization
const name;

6. Временная мертвая зона

В отличие от синтаксиса var, переменные let и const не имеют характеристик подъема. Переменная, объявленная с помощью любого из них, не может быть доступна до тех пор, пока не будет объявлено.

if (condition) {
    console.log(typeof value);  // ReferenceError!
    let value = "blue";
}

Здесь переменная value определяется и инициализируется с помощью let, но этот оператор никогда не выполняется, потому что предыдущая строка выдает ошибку. Проблема в том, что значение существует в том, что сообщество JavaScript назвало временной мертвой зоной.

7. Связывание блоков в циклах

одна область, где разработчики больше всего хотят, чтобы область видимости переменных была блочной, находится внутри циклов for , где переменная предназначена для использования только внутри цикла. Бывший:

for (var i=0; i < 10; i++) {
    process(items[i]);
}
// i is still accessible here
console.log(i);                     // 10

8. Функции в циклах

Характеристики var уже давно делают проблематичным создание функций внутри циклов, поскольку переменные цикла доступны из-за пределов цикла. Рассмотрим следующий код:

var funcs = [];
for (var i=0; i < 10; i++) {
    funcs.push(function() { console.log(i); });
}
funcs.forEach(function(func) {
    func();     // outputs the number "10" ten times
});

9. Глобальные привязки блоков

Еще одно отличие let и const от var заключается в их глобальном поведении. Когда var используется в глобальной области видимости, создается новая глобальная переменная, которая является свойством глобального объекта. Это означает, что вы можете случайно перезаписать существующую глобальную переменную с помощью var, например:

// in a browser
var RegExp = "Hello!";
console.log(window.RegExp);     // "Hello!"
var ncz = "Hi!";
console.log(window.ncz);        // "Hi!"

10. Новые передовые методы привязки блоков

Пока ECMAScript 6 находился в разработке, было широко распространено мнение, что вы должны использовать let по умолчанию вместо var для объявлений переменных. Для многих разработчиков JavaScript let ведет себя именно так, как, по их мнению, должен был вести себя var, поэтому прямая замена имеет логический смысл. В этом случае вы должны использовать const для переменных, которые нуждаются в защите от модификации.