Pull to refresh

Блокировка видимости с помощью Let в JavaScript

Reading time3 min
Views12K
Let — это такое ключевое слово с помощью которые мы можем определить переменную с ограниченной областью видимости, и эту область видимости мы можем ограничить аж четырьмя способами. Люди знающие OCaml сразу найдут параллель между let… in в Ocaml и let в JavaScript.
На хватит слов, давайте рассмотрим каждый способ применения let.



Включаем поддержку Let


Возможно у вас не получится сразу воспользоваться Let, но не огорчайтесь возможно Let заработает когда вы укажите type=«application/javascript;version=1.7» или вызовите version(170).

Область видимости для одного блока


С помощью let мы можем определить переменную видимой только в определенном блоке кода.
Синтаксис такого определения выглядит так
let(define vars){
some expression
}

А чтобы было понятней давайте рассмотрим простой пример. Пусть Bob живет в России и хочет купить DreamPlug он знает что в СНГ эта штучка будет стоит 300$, он отправляется в Европу чтобы купить подешевле, покупает и возвращается в Россию, и хвастается друзьям что у него есть комп из розетки и когда его спрашивают про цену он отвечает 300$.
Посмотреть данный пример
//Bob в России
dreamplug = new Object();
dreamplug.price = 300;
let(dreamplug.price = 150){
//Bob приехал в Европу
Bob.buy(dreamplug); // Bob покупает dream plug за 150$
}
//Bob вернулся в Россию
Bob.onmessage = function(event){
if(event.data == "Сколько стоил?")Bob.postmessage(price + "$",event.origin) //Когда Bob-а спрашивают он отвечает
}
//Данный пример заработает только если вы определите обьект Bob с методом buy
//И да, я выражаю человеческие разговоры через JavaScript


Область видимости для одного выражения



Практически тоже самое что и для блока но применяется к одному выражению(кто бы мог подумать). И соответственно не надо ставить фигурных скобок.
Для понятности рассмотрим пример с Bob-ом. Итак, наш Bob впал в детство и вспомнил то как он отвечал по признакам делимости у доски. Он отвечал по признаку делимости на два, кроме одного примера в котором надо было ответить по признаку делимости на 3.
Посмотреть данный пример
//Признак делимости на два
pred = function(x)!(x%2) //Предикат признака делимости на два
pred(3)
//Здесь я пропустил еще пару ответов Bob-a у доски
pred(2)
let(pred = function(x)!(x%3))pred(4) //Предикат признака делимости на три


Некоторые хабровчане (а именно те кто не знают что такое функциональный ЯП) наверняка заметили что тут мы определяли с помощью let не переменную, а функцию, но не забывайте что JS — функциональный ЯП, и функция является полноценным типом.

Let внутри цикла for


Мы также можем определит переменные с помощью let для цикла, единственным отличием от определения с помощью var будет то что переменная не будет в области видимости цикла и ничего кроме него.
Итак, пусть Bob пошел в магазин за покупками.
Посмотреть данный пример
list = ["msp430","avr","pic","msp430 Launch pad"] //Bob не тупой и у него есть список поупок
var i = 100; //Прсто Bob-у понравилось это число
for(let i=0;i<list.length;i++){
  Bob.buy(list[i]); //Bob купил вещь из списка
}
Bob.say('Мне нравится число ' + i) //100!!!


Let внутри блока



Мы можем определить с помощью let переменную внутри определенного блока. Отличием от определения let для блока кода будет в том что здесь начав определять переменную она станет undefined и только когда мы присвоим ей значение он станет не undefined. То есть например. Если Bob-а спросят квадрат его любимого числа, делать так нельзя.
Посмотреть данный пример
let i=100
{
let i = i * i
Bob.say(i) //NaN так как когда мы написали let i - мы определили i внутри блока i пока что undefined и при умножении undedined на undedined мы получили NaN
}


Но тем не менее можно делать вот так:
Посмотреть данный пример
let i=100
{
let m = i * i
Bob.say(m) 
}


Буду рад услышать замечания относительно статьи и адекватности.
Tags:
Hubs:
+27
Comments28

Articles