#2 ES6 - let

poster
В этом уроке мы разберем, чем отличается let от var и почему использовать let предпочтительнее.
Понравилось? Поделитесь с друзьями!
Понравилось?
Поделитесь с друзьями!
Комментарии
Текст видео

В этом уроке мы с вами разберем, что такое let в Ecmascript 6.

Вместо var теперь используют let. То есть обычное присваивание переменной выглядит не

var a = 3;

а

let a = 3;

Зачем вообще было придумывать новый синтаксис?

Первое и самое главное отличие let от var, это то, что она создается внутри блока в котором обьявлена. Это упрощает работу с if, while, for.

Например, на es5 мы пишем вот такой код

var a = 3;

if (true) {
  var a = 5;
  console.log(a);
}
console.log(a);

У нас вывелось 5 и 5, хотя по логике в нормальном языке у нас бы вывелось 5 и блоке if, а снаружи, так как это уже другой блок, вывелось бы 3. Но так как у нас javascript обладает некоторыми проблемами, то здесь одна переменная а на весь код, она описывается вверху кода, а в блоке if она просто модифицируется. Но, по нормальному, мы ожидаем, что мы создадим новую переменную внутри if и будем работать с ней. Для того, чтобы избежать такой проблемы, мы можем использовать let.

С ним переменная внутри if будет независимой переменной внутри блока

let a = 3;

if (true) {
  let a = 5;
  console.log(a);
}
console.log(a);

То есть, применяя let, вы можете быть уверенны, что переменная всегда будет доступна только внутри блока.

Если же мы удалим внешнее обьявление переменной, то переменная в блоке выведется нормально, а второй console.log выдаст ошибку, так как переменна а существует только в блоке и не видна вне этого блока.

if (true) {
  let a = 5;
  console.log(a);
}
console.log(a);

Второе отличие, это то, что переменную let нельзя переопределить. В ес5 вы можете написать

var a = 5;
var a = 3;
console.log(a);

Этот код без проблем переопределит там переменную

Let же выбросит нам ошибку про повторное определение переменной

let a = 5;
let a = 3;
console.log(a);

То же самое будет с циклами. Если у нас есть 2 цикла и мы используем в каждом из них let, то они просто будут двумя локальными переменными. И снаружи эта переменная будет не видна.

for(let i = 0; i<10; i++) {

}
for(let i = 0; i<10; i++) {

}
console.log(i);

Третье отличие, это то, что let в цикле создает отдельную переменную для каждой итерации. В es5 обычная проблема с замыканиями в цикле выглядит так.

var fs = [];
  for(var i = 0; i < 10; i++) {
    fs.push(function (){
      console.log(i);
    })
  }

Здесь мы хотим создать массив функций, каждая из которых будет выводить i в консоль. Если мы вызовем любой елемент массива fs, то мы видим, что в консоль всегда выводится 10. Это потому, что переменная i просто переприсваивается и замыкание является общим для всех итераций.

Если мы используем let, то проблемы не будет. Так как каждый раз будет создаваться отдельная переменная для каждой итерации.

var fs = [];
  for(let i = 0; i < 10; i++) {
    fs.push(function (){
      console.log(i);
    })
  }

Итак, в этом уроке мы разобрали, чем отличается var от let и как вы видите, с let меньше проблем и он работает проще и понятнее. Поэтому использовать let всегда предпочтительнее.

Если у вас возникли какие-то вопросы или комментарии, пишите их прямо под этим видео.

Только зарегистрированные пользователи могут оставлять комментарии.  Войдите, пожалуйста.
Атхам Султон
1год назад назад
Объясните, пожалуйста, почему тогда в цикле for (let i = 0; i <10; i++) переменная i вообще увеличивается на 1 если с каждой итерацией i должна быть новой и всегда равна 0.
monsterlessons
1год назад назад
Я не говорил, что она всегда будет новой и всегда будет равна нулю. i в данном случае просто локальная переменная, которая не видна снаружи цикла. В этом и разница с var. let с циклами и условиями работает по принципу функции. все переменные внутри будут локальные.