Переменная let.
Сейчас пришло время более подробно познакомиться с переменной
let и ее важнейшими отличиями от var.
Лучше всего это сделать на примерах.
В папке src в файле let.js запишем следующий код:
if ( true ) {
var temp = "ES5";
}
console.log(temp);
Запустим скрипт для транспиляции нашего кода. Если вы не помните настроек, то стоит посмотреть пост:ES6 подготовка к работе.
npm run watch
В папке dist появится файл let.jsсо следующим содержимым:
"use strict";
if (true) {
var temp = "ES5";
}
console.log(temp);
Он ничем не отличается от исходного, кроме добавления
"use strict".
Тпереь в файле index.html в теге
script добавим путь к файлу let.js из папки dist.
<script src="dist/let.js"></script>
Сохраняем и открываем файл в браузере. Откроем консоль и увидим:
Теперь, если мы поменяем
var на let в папке src, то мы увидим
следующее сообщение в консоле:
Это говорит о том. что наша переменная необъявлена!
Это произошло потому, что
переменная объявленная через
let будет видна только внутри блока с
фигурными скобками, в котором она объявлена!
В этом легко убедиться если посмотреть в папку dist/let.js:
"use strict";
if (true) {
var _temp = "ES5";
}
console.log(temp);
У нас появилась переменная
_temp, а в консоле выводится temp
(без нижнего подчеркивания).
Хостинг - подьем переменных
Переменная объявленная с помощью
let не поднимается
и поэтому их нельзя использовать до их объявления!
Пример:
В файле index.html подключим исходный код из файла src/let.js.
<script src="src/let.js"></script>
А в самом этом файле вызовем переменную до ее объявления:
console.log(temp);
let temp = "ES5";
Сохраним и посмотрим на консоль.
Там будет ошибка, потому что наша переменная не объявлена!
То есть мы не можем использовать переменную объявленную с помощью
let
до её объявления!
Если поменять
let на var, то мы увидим:
Ошибки не будет. Будет
undefined
Мы видим
undefined потому, что перед тем как выполнить код, движок JS
поднял переменную temp наверх и присвоил ей значение undefined,
после чего мы вывели значение в консоль, и только после этого, присвоили переменной temp значение ES5
Это выглядит вот так:
var temp, //undefined
console.log(temp);
var temp = "ES5";
Рассмотрим применение let на практике.
Создадим пять кнопок в файле index.html
src/let.js Все удалим и объявим переменную
buttons и поместим в нее все кнопки:
var buttons = document.querySelectorAll('button');
Далее простой цикл
for внутри которого мы объявили переменную button и присваеваем ей все кнопки по порядку.
А в качестве текcта кнопки будет значение i
button.innerText = i;
При нажатии на кнопку я хочу, чтобы в консоле отобразился её порядок:
button.onclick = function(e) {
console.log(i);
};
Файл
let полностью:
var buttons = document.querySelectorAll('button');
for (var i = 0; i < buttons.length; i++) {
var button = buttons[i];
button.innerText = i;
button.onclick = function(e) {
console.log(i);
};
}
Сохраняем. Открываем в браузере и видим, что при нажатии на любую кнопку отображается в консоле только цифра 5.
Если вы не сталкивались с этой проблемой. то сразу не понятно, что не так.
В C# или Java аналогичный код работал бы правильно.
Все дело в том, что когда мы пишем
var i, то мы создаем глобальную переменную, которая будет видна всем функциям, которые мы
создали для наших кнопок в качестве обратного вызова.
Это тоже самое. что записать наш код так:
var buttons = document.querySelectorAll('button');
var i;
for ( i = 0; i < buttons.length; i++) {
var button = buttons[i];
button.innerText = i;
button.onclick = function(e) {
console.log(i);
};
}
Теперь ВСЕ функции видят одну и тужe
i.
Так работают замыкания в JavaScript!
Чтобы исправить ситуацию, нам нужно сделать так, чтобы на каждый цикл создавалась своя переменнная
i.
Тогда и каждая функция получит свою i!
Для этого мы используем
let!
Меняем
var на let и проблема решена!
Файл src/let.js
var buttons = document.querySelectorAll('button');
for (let i = 0; i < buttons.length; i++) {
var button = buttons[i];
button.innerText = i;
button.onclick = function(e) {
console.log(i);
};
}
Из этого можно сделать вывод, что
let делает работу с переменными более понятной и интуитивной.
Особенно для людей с опытом работы в других языках.







а откуда на странице появились кнопки?
ОтветитьУдалить