Javascript-джедай #14 - Цепочки областей видимости

preview_player
Показать описание
Рекомендации по теме
Комментарии
Автор

Для тех, кто смотрит этот урок в 2020 и позже: теперь в javascript локальные блоки с фигурными скобками тоже могут создавать области видимости. Если использовать let вместо var.

SomeTricks
Автор

И награду за самый полезный, точный и исчерпывающий комментарий получает... [барабанная дробь] Алексей Ч!

artsorax
Автор

КОнспект
0:22 Область видимости переменной - это часть программы где эта переменная
определена и доступна, по области видимости переменные делятся на
глобальные и локальные. Глобальными являются все переменные объявленные вне
каких либо функций, а те что внутри ф - локальными.

Локальные переменные одноименные с глобальными всегда имеют приоритет.
В JavaScript только функции создают локальные области видимости
(function scope)
1:08 функции в JavaScript могут быть вложенными
var i = 5;//вообще при объявлении глобальных можно и не писать var
//чего не скажешь о локальных, иначе мы будем менять переменную в
//предыдущей области видимости

var func = function(){
var i = 10;
console.log(i);//выведет в консоль 10
var innerFunc = function(){
var i = 15;/*Если убрать отсюда переменную i то эта функция пойдет
искать i на следующем уровне видимости, вплоть до глобальных
переменных, а если не найдет*/
console.log(i);//выведет в консоль 15
}
innerFunc();
}
func();
console.log(i);//выведет в консоль 5

3:00 hoisting (подъём) - потому что интерпретатор поднимает объявление
всех переменных в начало функции.(только обьявление, не инициализацию)
JavaScript хитрый, он заранее знает что переменная будет обьявлена,
но не собирается ее инициализировать, поэтому при обращении к еще
необьявленной переменной мы получим undefined;
4:30 Поэтому обьявляй лучше все переменные в начале функции, облегчи
работу интерпретатору и избежишь ошибок)

STRIPPEDSTAR
Автор

Вот блин. Читаю книги, смотрю уроки и всё ещё ничего не знаю. А смотрю уроки Sorax и всё знаю оказывается, просто инфа систематизируется лучше.

thefuturejulio
Автор

Вау, я читаю Фланагана и теперь понимаю о чем говорит Sorax. До книжки, во время просмотра чувствовал, что я на паре по философии.

gigabek
Автор

Если хотите выучить, вслушивайтесь в каждое слово!!!

Владислав-шф
Автор

01:00 Поправка: сейчас уже с приходом ES6 появились константы, у которых scope как раз ограничивается { }, в то вреия когда была запись этого урока локальный scope был только внутри функций, о чем и повествует Sorax

eleukhin
Автор

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

MsDetech
Автор

2:08: "... Если при объявлении глобальных переменных мы, строго говоря, можем не писать ключевое слово var, поскольку при этом ничего не изменится..."

Это не так:
Во-первых, в строгом режиме ES5 при попытке присвоить значение необъявленной перменной возбуждается ошибка.
Во-вторых, если глобальная переменная объявляется с помощью инструкции var, создается ненастраиваемое свойство, т.е. свойство, которое невозможно удалить с помощью оператора delete. Если же используется нестрогий режим и необъявленной переменной присваивается некоторое значение, интерпретатор создаст настраиваемую глобальную переменную.

АлексейМихайлов-тыц
Автор

sorax а что у тебя за деволопер тулз приложение ? где найти такое ?

anthonyfink
Автор

Спасибо за урок! Жду ещё. Всё понятно объясняеш! Так держать!

sergejsvisockis
Автор

Ещё про hoisting можно было указать что функции также поднимаются на самый верх. Можно вызвать функцию выше, до её объявления.

Алексей-псевдоним
Автор

Какая разница что будет делать интерпретатор, понимать нужно, сто проц но нафига? Помочь ему)? Это все равно что сказать, давайте переменный из одной буквы делать на выходе ведь так и будет(всегда код минифицируют для прода).
Если в модуле двадцать переменных просто в рядок сверху ставить мне кажется не увеличивает читаемость никак.

JohnDoe-py
Автор

в Java так-же не имеет значения где объявлять переменную так-же сначала идет  загрузка сначала переменных класса (статические) и их инициализация, если таковая имеется при объявлении потом переменные объектов классов, после этого уже идет выполнение конструктора класса. Если провести аналогию то-же самое.

sferam
Автор

Здравствуйте Sorax, вы так понятно объясняете, можете такие же уроки по руби сделать?

mahabbatm
Автор

В Си нельзя объявлять переменные не вначале блока. То, что было сказано в видео относится уже к ++ или #.

Archik
Автор

2:48 время.
Я не понимаю, почему консоль выводит десять.
Ведь интерпретатор действует (как я понимаю) так:

4 строка: объявление переменной i = 10
10 строка: вызывается функция, внутри которой i = 15

Так почему же консоль лог выводит 10, а не 15. Почему 10 не перезаписывается на 15. ???

fermatoone
Автор

тут все не совсем точно функции в ДжаваСкрип не просто функции... и как сказал MsDetech еще есть глобальный объект... и т.п. да и сама JS не так уж проста

chefranovaexei
Автор

В этом видосе подается устаревшая инфа. Новичкам лучше изучать другие источники.

wlarcz
Автор

В очередной раз убедился что js до не возможности убог

vatakiller