0: 0 2.
1: Мама, вся земля в руках у твоего сына. Ма ма ма мама.
2: Украина, Украина.
3: А страху подушка.
4: Вся земля в руках, мама.
5: Вся земля в руках у твоего сына, ма ма ма.
6: Не.
7: Мама, Марина, будем Украина, ма.
8: Так-то почнём, начнём.
9: Вот так вот это видео будет записано русским языком.
10: Украинский будет записано отдельно c. Видео записано на российский, российскую, украинская версия бурана крыма, посылание на украинскую версию буду размещено в описи.
11: Мне очень часто говорят, что в начале видео нужно представляться. Ну, я представляюсь, я могуч, я никто и зовут меня никак легче стало. Я не уверен, что стало легче. Единственное.
12: А че, что можно здесь, в этой всей тягомотине добавить? Это?
13: То, что мне, наверное, 46 лет, и то, что я 1 свою программу, которая оказалась полезным кому-то, кроме меня, написал больше 34 лет назад.
14: Относительно проблем с качеством видео и со звуком.
15: Прошу связываться со своим, с моим звукорежиссёром. Он в этом во всем виноват. Те, кто смотрел мои старые записи, прекрасно знают, кто он, где он и как он живёт. Я даже настаиваю.
16: На том, чтобы вы обязательно ему написали, оскотинилась, скотина.
17: А вот относительно ошибок технического характера я настаиваю на том, чтобы они обязательно были озвучены, и желательно в публичной форме.
18: Потому, как говорила моя бабушка, если ты назвался клизмой, то полезай туда, где твоё собственное место.
19: Я наконец то дошёл до того, что начинаю тестировать, проверять главы книжки относительно языка джаваскрипт, который я так много и часто обещал, которое уже было написано мной штук, наверное.
20: 10 разных версий. В конечном итоге я все-таки пришёл к формату, который меня действительно удовлетворяет.
21: И впервые за все эти версии он действительно дошёл до того состояния, при котором я думаю, что его можно начинать выкладывать. Эта глава это запись на основе предыдущей версии, которая называлась джаз.
22: Скрипт в картинках на основе именно её я и переписывал весь материал, и прямо сейчас оно будет иметь все основные те правки, которые для меня были важны, и я хочу
23: Хотел бы проверить, насколько это доходчиво понятно звучит для окружающих.
24: Так, про себя я сказал про это я сказал про это я сказал я себе, видите, для того, чтобы опустить себя на уровень всех стримлеров, я стал себе теперь ставить чек лист и по чек листу смотреть, ничего ли я не забыл. Ага, значит,
25: Теперь начинается самое главное во первых, для кого это видео или для кого эта информация, эта информация, прежде всего для тех, кто думает, что this в javascript это контекст.
26: Следующая группа людей это те люди, которые хотят узнать, что такое, что такое вы, джаваскрипт, поскольку ничего об этом не знают.
27: Ещё 1 категория это для тех, кто очень, очень любознателен и хочет понять, как он действительно работает. Джава скрипт. Ну и последняя категория людей, она действительно отдельная. Я совсем недавно для себя это выяснил. Это те люди, которые очень любят решать Зада.
28: Собеседований. Люди, которые сталкивались с собеседованиями, с вопросами, относительно знают, что достаточно часто там можно встретить любопытные, якобы заковыристые задачки, а самое
29: Весёлое в этих задачках это объяснение, объяснение того, как эта задачка решается.
30: И что самое интересное лично для меня во всей этой области это то, что все эти объяснения в большинстве случаев не имеют никакого отношения к реальности.
31: Почему потому что vs java script это не контекст никогда им не был никогда не будет нет ничего общего с контекстом в других языках программирования вис это это контекст в java скрипте нет.
32: В java скрипте this это обычный идентификатор, не совсем обычный идентификатор, это идентификатор, который имеет поведение, очень схожее с обычным идентификатором.
33: Для того, чтобы не долбить спецификации, я хочу продемонстрировать, как на простых примерах, разбирая простые примеры и вводя постепенно.
34: Тот язык, которым пользуется спецификация, можно было бы понять, что это такое, и самое главное не мучить больше людей вопросами а куда девается контекст и почему так джаваскрипт такой странный?
35: Что вам нужно знать перед тем, как вы начнёте это слушать, для того, чтобы понять то, о чем я говорю, вы должны себе иметь общее представление о том, как в java script определяются стрелочные функции.
36: Вы должны в общих чертах иметь представление о том, как происходит поиск идентификатора в javascript если говорить колхозным языком, то, скорее всего, для вас поиск идентификатора более знаком.
37: С точки зрения, не с точки зрения, а в формулировке.
38: Как переменная видна в какой-то области видимости. Я подчеркну лишний раз моя книжка в том числе посвящена этому разделу, даже не в том числе. Она, наверное, в 1 очередь этому посвящена. Это программистский жаргон.
39: Который к языку java script не имеет никакого отношения в языке javascript нет областей видимости, в нём нет переменных и так далее, и так далее, но для того, чтобы сейчас не сбивать с толку, я могу иногда употреблять и буду.
40: Периодически подчёркивает, что в данном случае я использую не язык официальной спецификации, а жаргон, который понятен окружающим, вот как, например, области видимости или переменные, это жаргон в джаваскрипте такого нет, в спецификации такого нет, там все объяснено намного проще.
41: Намного более логичным. Это, кстати, для меня основная это отклонение от темы. Это для меня очень большая загадка, на какой черт было придумывать целый набор аналогий и абстракций или тянуть аналогии и абстракции из
42: Других Языков в язык, где его механизмы объяснены при помощи очень простой машинерии, которая максимально логично. 1 вытекает из другого. Для меня это очень большая загадка, я
43: Возмущаюсь по той причине, что я сам стал в своё время заложником этой же самой загадки, когда
44: В общем, это не важно, че, кому интересны мои путные подробности, так итого, что вам нужно знать, да, как определяется в общих чертах, как задаётся синтаксис стрелочных функций, как происходит поиск идентификаторов джаваскрипт или как вы это можете знать, области.
45: Видимости должны себе чуть чуть представлять, что такое глобальный объект, при этом должны сейчас себе понимать, что все следующие примеры будут идти исключительно в strict mode для режим.
46: Non strict, мы отдельно, в самом конце я отдельно проговорю некоторые нюансы. Ну вот, собственно говоря, и все. И с этого тогда мы начнём
47: То, ради чего мы здесь собрались.
48: Хочешь знать, чему вы равняется? Мне котики нравятся эти. Это не я рисовал. Безусловно, это какой-то прекрасный художник.
49: Проверь, обратите внимание на котика в правом нижнем углу.
50: Как и какая функция запускается. Это базовое правило, которое вы должны держать в своей голове в тот момент, когда вы хотите понять, что сейчас происходит.
51: Ходит с vs.
52: Усвойте 1 простое правило оно должно отпечататься у вас в голове this, в javascript зависит от 1 единственного основного фактора все прочие это косвенные косвенные случаи, которые, которым в большинстве случаев
53: Вы иметь отношение всерьёз не будете в большинстве случаев, когда вы сталкиваетесь с с. Джаваскриптом, он зависит от того, какая и когда функция была запущена.
54: Под словом функция можно понимать много разных вещей в языке javascript.
55: Это сейчас я делаю паузы, потому что начал сверяться с чек листом, не пропустил чего важного? Да. Ага, это я стал переходить, забег забегать вперёд. Ну, не важно. Забегая вперёд, скажу.
56: Люди, которые новые приходят в язык javascript, для них существование классов, существование методов в объекте это все вещи, которые являются между собой чем-то.
57: Разными, чем-то разным, дифференцированными, отличающимися чем-то друг от друга. На самом же деле, с точки зрения языка javascript, я же повторяю, это очень простой язык для понимания и максимально логичный. Все эти вещи являются 1 единственным функцией, а
58: Если посмотреть ещё глубже, они являются объектом, который обладает особым свойством, возможностью интерпретирования и запуска кода. Ну, является объектом все вокруг джаваскрипта. Что касается выполнения кода, крутится
59: Вокруг 1 единственного это вокруг функции, она всегда определяется 1 единственным образом. У неё есть её брат, который немножко отличается от основной. Появился он совсем недавно. Это стрелочная функция вообще.
60: Типов функций в языке javascript достаточно много. Я недавно пересчитывал их по 20 штук, но хохма в том заключается, что все эти типы, они, по сути дела, проистекают из 1 единственного все они лежат корнями в
61: Тем, чем является базовая основная функция, которая появилась когда-то с Бог знает каких времён.
62: Для того, чтобы, как я сказал, чуть выше, точно всегда ориентироваться, с чем и когда связан вис, мы должны помнить.
63: Что this это ключевое слово, или идентифика, или выражение, которое по своему поведению максимально близко к поведению идентификатора под словом идентификатор, я всегда понимаю.
64: То, что, говоря колхозным языком, это неправильно, я подчёркиваю, что я произношу эти слова, все время совершая там 10000 крёстных знамений, потом хожу в церковь отмаливать грехи, используя переменные название.
65: Переменных это на самом деле это имена идентификаторов, а this это такой вот особый тип идентификатора с некоторым особенным поведением проще всего к нему относиться именно таким образом.
66: Почему таким образом? Потому что каждый раз, когда вы пытаетесь понять для себя, чему, с чем, с каким значением связан вис, в большинстве случаев это всегда связано с тем, как вы пытаетесь разобраться, с чем связан иденти.
67: Фикатор когда вы начинаете искать его по областям видимости или если говорить академическим языком, то есть опираться на терминологию непосредственно языка java script это проходя по цепочке окружений, которые у нас возникают вокруг.
68: Выполнение нашего кода вообще в javascript все очень просто есть код, который у нас выполняется. Мы прекрасно понимаем, что если выполняется код, то вот наша среда, которая этот код выполняет, она должна иметь какие-то внутри себя соображения.
69: На тему того, какую команду следующую выполнить, какие у нас там идентификаторы и что у нас там ещё сейчас характерно для этого кода. И вот, вот эта вот штука, которая существует вокруг нашего кода, она называется энвайрмент на английском языке, на русский, её
70: Очень правильно переводят как окружение, скорее правильно переводить как среда, но можно переводить, как и как окружение вообще это свойственно русскому языку, что у него очень много слов напрямую связано с контекстом.
71: С контекстом того, каким образом не контекстом того, является this контекстом или нет, а с контекстом того, как это слово используется, и вот эти окружения, принцип этих окружений это вообще база, база, основа понимания того, как работает язык javascript, они существуют.
72: Всегда вокруг того кода, который у нас выполняется при этом, при вызывании, при вызове, не вызывании, боже мой, при вызове.
73: Новой функции формируется новое окружение. У следующей функции, следующее окружение и так далее, и так далее, и так далее. Окружение существует только вокруг того кода, который сейчас непосредственно выполняется. Иными словами, если у вас в коде встречается определение функции, то код
74: Который находится внутри этой функции. Вокруг него будет создано своё собственное уникальное окружение. Цепочка окружений это то, что вам, наверное, проще всего будет понять, как на на уровне колхозного языка. Это цепочка областей видимости, хотя это совсем не тоже самое цепо.
75: Областей видимости это притянутая за уши концепция к тому, как работает язык javascript, как я говорил раньше, это вообще базовая часть, с чего начинается книжка, рассказывающая про javascript, каким образом он функционирует и общается между собой.
76: С точки зрения разрешения идентификаторов, так вот, каждая функция, каждый наш код, который начинает работать вокруг него, создаётся некое окружение, внутри которого javascript runtime, который выполняет наш код, хранит всю необходимую информацию.
77: Полнение этого кода. Поэтому самое 1, с чего мы начинаем, в том, чтобы понять, как реально работает with с точки зрения спецификации в языке javascript, мы начинаем с самого самой простой ситуации.
78: Это ситуации, когда мы спрашиваем, а с чем связан зис, когда он находится внутри глобального окружения, глобал инвайрментал? То, что колхозным языком часто называют глобальной областью видимости нет глобальной области видимости в джаваскрипте, хотя
79: Потому что в джаваскрипте, согласно спецификации, может быть несколько глобальных областей видимости, но об этом когда-нибудь потом это глобальное окружение. И когда мы себе задаём вопрос, а чему, с чем, с каким значением сейчас связан у нас зис? Вот мы
80: Теперь дальше я буду все, все объяснять непосредственно на на объяснении примеров, немножко говоря о спецификации. А самое главное, обращайте внимание на справа на язык, блок схем, язык, блок схем. Это очень такой простой язык.
81: Который позволяет записывать алгоритмы. Я использую самую простую его версию, в которой мы имеем всего лишь навсего кружочек. Это значит, откуда мы пришли. Ромбик это условие? Нет, да, тут понятно. Влево, вправо. Ну и квадратик, это будет шаг. И вот мы
82: Рассматриваем наш самый базовый пример, самый простой, самый базовый пример, где мы находимся, где у нас наша единственная команда. Мы находимся в strict режиме. Я сказал об этом заранее. Мы хотим понять, чему здесь равен наш идентификатор иис, с каким значением он связан, и алгоритм.
83: С точки зрения спецификации, для того, чтобы понять, чему, с чем он здесь связан, очень простой, он начинается с простого вопроса. Я нахожусь внутри функции.
84: И если мы оказываемся не внутри функции, а согласно нашему примеру, который у нас на экране, мы сейчас не внутри функции, то мы переходим к очень простой ветке, которую я назвал инскрипт оо модул. Мы находимся внутри скрипта или внутри модуля скрипт.
85: И модуль это 2 термина спецификация языка джава скрипт, который описывает разный способ выполнения кода. Скрипт это тот код, который запускается в принципе у нас по умолчанию модуль это запуск того же самого кода с определённым пара.
86: Параметром, который называется module, когда мы используем import, это мы запускаем код в рамках окружения модуль мы можем запустить рантайм с точки зрения того, чтобы он выполнялся в окружении модуль сразу с самого начала, но по умолчанию так,
87: Исторически сложилось вот то базовый запуск нашего кода он лежит в окружении, которое с точки зрения спецификации называется скрипт, почему часто и называют то, что тот код, который мы пишем на языке javascript, script, скриптом или.
88: Скриптами, или почему он в html у нас выделен тегом script это не потому, что придумали таким образом скрипт, ну так потому что он так работает, возвращаемся к сути, итого мы пытаемся понять чему у нас равен идентификатор this, с каким значе.
89: У нас связан. Мы пришли в ветку, которая называется, мы поняли, что мы не внутри функции. Мы пытаемся понять, мы в скрипте или мы в модуле. И здесь мы задаём себе вопрос. Я внутри модуля. Если я внутри модуля ответа, да, то тогда ответ сразу же
90: Идёт следующее this равно он дефайнит.
91: Никакого другого варианта при выполнении кода внутри модуля в случае this при старте существовать не может.
92: Угу. Так, и?
93: Для того, чтобы все это было немножко нагляднее. По моему, у меня здесь есть пример. Да, вот он, наш пример. Прекрасно.
94: Вот если мы возьмём
95: Среду в 8. Сейчас я попробую это сделать крупнее, чтобы это было, чтоб глаза себе не ломать.
96: Так, ага, код здесь видно крупнее, а консоль крупнее делать не умеет, да? Ну, тогда я здесь сделаю.
97: Так.
98: Сейчас я это сделаю здесь крупнее, чтобы не ломать себе глаза. О, шикарно. Есть, example, 9, да, в 8. Это среда выполнения javascript кода.
99: Которая имеет, ну, в 8. Это сам по себе рантайм, о котором вы должны знать. А сама по себе среда это не Нода, а это в 8. Это среда, которая имеет минимум из возможных обёрток вокруг себя.
100: Для того, чтобы не мешать изучению языка и понимать язык javascript именно тем способом, именно таким, какой он есть, так у нас экзампл 9 вот для того,
101: Чтобы показать в нём есть специальный флаг модули это запуск этого кода в окружении того, как будто бы это загружался модуль, и мы здесь получаем вот наш этот ответ. Undefined, кстати, может быть, оно будет?
102: Видно, если кто-то меня ещё слушает или слышит, вы мне скажите, пожалуйста, вот сейчас то как захвачен рабочий стол, там достаточно видно код при в.
103: Полнение.
104: Наверное, должно быть все-таки видно. Или здесь можно его увеличить? Я че то об этом как-то заранее не подумал.
105: А ну-ка нет, нет, не увеличивается, да.
106: Ну да фиг с ним, надеюсь, что будет видно. Ага, видно хорошо. Вот прекрасно. И вот я тогда в 8 в данном случае, чтобы видеть и код сверху, и этот запускаю в окружении модуля, и мы видим, что в окружении
107: Модуля у нас вис равняется андефайнд, возвращаясь к нашему слайду, прекрасному вжик вот он на слайд, я внутри модуля да vs по умолчанию связан со значением undefined аут.
108: Все вопрос решили, если наш выс по умолчанию связан не со значением, если мы находимся не внутри модуля, а внутри обычного выполнения скрипта. То есть вот мы выполняем наш скрипт не как
109: Модуль то with по умолчанию у нас связан с глобальным объектом. И здесь дальше в вступает в силу очень любопытная штука, которую, с 1 стороны, знать надо, а с другой стороны, в большинстве
110: Случаем, вы с ней сталкиваться никогда в жизни не будете? Она заключается в том, что, согласно спецификации языка джава скрипт хост среда это то та среда, которая содержит внутри себя рантайм и внутри этого рантайма выполняет наш код.
111: Например, браузер это ghost Нода это ghost, она имеет возможность по умолчанию изменить то значение this, которое было согласно спецификации связано с глобальным объектом.
112: Это сейчас увидите, если мы запускаем чистую в 8 среду, то выполнение этого кода его связывает с глобальным объектом, как это и должно было бы быть. А если мы воспользуемся нодой?
113: Например?
114: То мы увидим, что наш зис связан с пустым объектом, и это особая форма именно поведения рантайма нод, которое закреплено согласно спецификации. То есть каждый рантайм, который начинает выполнять какой-то код в том случае,
115: Если этот код выполняется не внутри модуля, она может сама установить vs так как ей хочется.
116: Что в алгоритме отражено равно значению, которое установил ghost в браузере по умолчанию и точно также устанавливается в глобальный объект в в 8, точно также согласно спецификациям, точно также устанавливается в глобальный объект с какого
117: Создатели ноды решили, что они хотят его установить в пустой объект на старте то Бог им судья по большому счёту, то-то, ради чего используется with это та ситуация, при которой мы крайне редко его будем использовать или не использовать.
118: Чаще всего вообще не использовать в нашем глобальном окружении по этой причине, в общем то, об этом то знать интересно хотя бы для того, чтобы в если встретитесь на собеседовании для с каким-нибудь
119: Интервьюером, который действительно понимает то, о чем спрашивает, он, может задать вот такой вот подковыристый вопрос а чему this равняется в том случае, если наша хост средой является Нода или там является?
120: 8 или является браузер, и ответ на этот вопрос заключается в том, что вы не должны знать, чему там равняется вис, а должны ответить на этот вопрос в следующей форме это this в данном случае связан с тем значением, которое определено спецификацией я посмотрю в специфика.
121: Пойму, что данное окружение связывает по умолчанию вис с этим, с этим значением, но на самом деле этот вопрос в большинстве случаев бессмысленнен именно по той причине, что with в глобальном окружении глобал.
122: В здравом уме никому не нужен по этой причине именно внутри модуля как части, которая спецификации, которая появилась значительно позже, с однозначным образом, вне зависимости от окружения, определён как undefined, то есть никаким образом не определён.
123: Так.
124: Поехали дальше.
125: Так, вот так. Нет, не так. Надо найти кнопку, которая бы быстро переключала мне эти слайды, или придумать как одновременно.
126: С этими слайдами показывать и код, потому что код очень важен, а слайды, конечно, это слайды.
127: Итого мы побывали в глобальном окружении. Ой, мы побывали в ветке оценки того. Мы находимся в скрипте или в модуле. Поняли, как это в общих чертах работает, и возвращаемся назад с этого момента.
128: Начинается постепенно. Самое интересное. Мы помним о том, что у нас является нашим основополагающим вопросом для определения того, чему, с чем связан вис, это вопрос, нахожусь ли я внутри кода функции я в коде функции.
129: Или нет, нет, мы уходим в скрипты или модули выше, мы описали специфическое поведение. А вот самое интересное начинается тогда, когда мы вдруг оказываемся внутри кода функции. И вот пример, на базе которого мы сейчас и будем
130: Это поведение у нас здесь есть некоторая функция do look this, внутри которой определена стрелочная функция do a thing, какая-то, внутри которой мы выводим в консоль текущее состояние идентификатора вис и.
131: Начинается самый простой этот алгоритм определения. Мы находимся внутри нормальной функции, да или нет, согласно нашему коду, который мы сейчас наблюдаем у нас на экране, мы, где вот у нас вызвался дуло квиз, мы попали в дуло квиз внутри здесь определилось, было
132: Задана аро фанкшн и потом было вызвано аро фанкшн. Мы в нормальной функции находимся? Нет, мы находимся в внутри аро фанкшн. Я напомню ещё раз с самого начала то, что я сказал, наиболее простой способ запомнить, что такое нормальная функция, ненормальная функция именно
133: В силу того, что дета градаций нормальных функций существует крайне много, это и bind e generator function, и, господи, что там ещё можно вспомнить, не будем сейчас ломать себе голову. Самое простое отличие это за.
134: Что нормальная функция это любая функция, которая, а и метод это любая функция, которая не является Арфан стрелочной функцией. Что такое стрелочная функция? Стрелочная функция? Это такая синтаксическая конструкция, которая между определениями аргументов и определениями
135: Тело функции содержит символ, равно больше стрелочку это стрелочная функция этого для себя в голове. Проще всего запомнить, это полностью соответствует спецификации, что на любой вопрос, когда мы себе задаём
136: Смотря на код является ли эта функция нормальной или не является ответ очень простой, если это не ro фанкшн, то это normal фанкшн, она также в спецификации ещё называется как орденаи кажется function.
137: Да, да, да, да, ординары могу неправильно произносить на английском языке. Прошу меня за это простить.
138: Я вроде бы проверял, пытался даже выучить, как это правильно, да, правильно. Ординари, ординари, обжект ордена и function. В нашем примере мы сейчас находимся, где внутри. Вот у нас вы
139: Ding мы оказались внутри стрелочной функции. Вот по нашему алгоритму мы и идём, это normal фанкшн нет, мы находимся внутри стрелочной функции, правильно? Правильно, переходим к ветке стрелочных функций.
140: Ой ой ой, стрелочных функций.
141: Все, что вам нужно знать про стрелочные функции это только то, что в тот момент, когда вы внутри неё пытаетесь понять, чему равен идентификатор this, то вы должны сделать Ровно то, чтобы вы делали для того, чтобы понять чему.
142: Любой другой идентификатор, то есть пройтись, по говоря колхозным языком, областям видимости, с момента определения вашей функции снизу вверх в поисках того, где наш зис определён. А если
143: Говорить академическим языком или языком спецификации вы должны пройти по цепочке окружений окружение вокруг аро в нашей фанкшн, потом окружение следующее, следующее до тех пор, пока мы не поймём, где this был задан.
144: То есть единственный исключительный случай, который добавляет у нас стрелочная функция для того, чтобы определить, чему у нас равняется зис.
145: Это случай, при котором мы просто стрелочную функцию игнорируем и переходим к родительскому окружению, что у нас и запечатлено вот на этом алгоритме. Если мы внутри a function, то нам нужно перейти к родительскому окружению. То есть нас совершенно не волнует.
146: Если мы оказались внутри стрелочной функции, мы даже не задумываемся над тем, меняет ли аро фанкшн как-то лис, влияет ли она на него каким-то образом, нас это вообще не трогает, кроме 1 единственного, к какому родительскому окруже.
147: Мы должны перейти для того, чтобы спросить у него, с чем связан вес, так?
148: И, возвращаясь теперь к нашему 1 примеру, с которого мы начали
149: Мы поняли для себя, что мы были в ro фанкшн, согласно нашей a function, мы должны были перейти к родительскому окружению, а родительское окружение для нашей аро фанкшн это окружение для функции do лок вис. Мы к нему перешли и опять ушли на.
150: Начало нашего алгоритма в ИНН и опять себя спрашиваем я в коде функции? Да, это нормальная функция. В настоящий момент мы уже оказались внутри нормальной функции, мы были в стрелочной функции, перешли к ветке стрелочной функции.
151: Поняли, что на нас стрелочная функция никаким образом на иис не влияет, можно просто забыть о существовании стрелочных функций, и определяем, что мы, согласно типичному алгоритму поиска идентификатора, либо по областям, говоря колхозным языком.
152: Областям видимости, либо правильным языком по цепочке окружений перешли к родительскому окружению, то есть к тому окружению, которое описывает создание стрелочной функции. И задаём себе Ровно те же самые вопросы, которые начались с самого начала. Я в коде функции.
153: Да, это нормальная функция. Вот теперь мы уже оказались в нормальной функции.
154: Да, теперь мы оказались в нормальной функции. Переходим к ветке нормальных теперь функций. Вот мы оказались в нормальной функции и теперь мы переходим к самому интересному. То есть я сейчас ещё раз кратенько проговорю то все самом в самом начале, что звучало оно
155: Вам забивать мозг и казаться чем-то очень сложным. На самом деле оно очень, очень простое, и это поверхностные знания, которые в большинстве случаев вам не пригодятся. Достаточно их просто приблизительно помнить, чтобы вспомнить, где посмотреть, что это значит, что если мы находимся не внутри кода Функ,
156: Не внутри кода функции, то все, что для нас имеет значение, это мы находимся внутри модуля или внутри обычного скрипта. Если мы находимся внутри модуля, то это означает, что this в окружении этого модуля по умолчанию
157: Связано со значением undefined если мы находимся в окружении скрипта, то this по умолчанию может быть связано с любым значением по умолчанию согласно спецификации, это должен быть глобальный объект, но любое.
158: Окружение, любая, любая хоз система, которая содержит внутри себя рантайм и выполняет код, она, согласно той же самой спецификации, может назначить любое значение, которое будет связано с with и, например, Нода при своём старте.
159: Кода в глобальном окружении привязывает пустой объект, а браузер привязывает глобальный объект. D8 привязывает глобальный объект. В большинстве случаев вы с этой поведением нигде не столкнётесь, потому что ником
160: Значение with в глобальном окружении, как бы и знать ни для чего не надо, но помнить в общих чертах, что это определено спецификацией в таком вот виде. Интересно. Следующий этап мы для себя должны выяснить, что
161: И запомнить, что раз мы находимся внутри функции, а именно функция вызов функции и является определяющим тем, с чем связано зис. Это самое главное, что нужно запечатать в своей башке. Зис изменяет вызов функции только вы.
162: Функции изменяет виз это особый случай, стрелочная функция, которая является особой функцией, отличной от нормальной функции, которая на самом деле ничего не меняет.
163: То есть 1 правило вызов функции это именно то, что производит к тому, приводит к тому, что this начинает быть связано с каким-то значением 2 правило если эта функция стрелочная, то она этого не делает.
164: Это особый случай, при котором стрелочная функция не выполняет никакой работы с with это не что-то исключительное, просто вот стрелочная функция, она на with никак не влияет. Вызов же нормальной функции это можно ещё представить на примере.
165: Воображаемым следующим образом. Представьте себе, что любая нормальная функция, не стрелочная, всегда имеет минимум 1 аргумент и этот аргумент зис, он есть всегда по умолчанию с точки зрения специфика.
166: Вызов нормальной функции это ситуация, при котором эта функция всегда вызывается минимум с 1 аргументом этот аргумент называется this, просто существуют несколько правил, при которых можно этот аргумент.
167: С чем-то связать, с каким-то значением он связывается не обычным способом, как мы привыкли передавать аргументы в функцию, у него есть своя форма передачи этого значения, ещё раз вызов нормальной, обыкновенной функции, а нормальная функция это любая функция, которая не стрел.
168: Это функция, которая всегда имеет минимум 1 аргумент это аргумент зис, и этот аргумент зис связывается с каким-то значением, всегда без исключения только в момент.
169: Того, когда эта нормальная функция вызывается.
170: Так, мы на странице 13, да, переходим к 14. И вот теперь мы
171: Прямо на примере сейчас начнём разбираться с тем, как это происходит.
172: Наш самый простой базовый пример да что ж такое у нас есть некоторая функция do лок вис, мы её вызываем внутри которой у нас происходит консоль лок с чем vs связан?
173: И здесь 1 правило, которое нужно запомнить в момент вызова любой нормальной функции, не стрелочной. Мы помним, что я сказал перед этим у неё всегда есть 1 аргумент зис, всегда без исключения.
174: Никаких вариантов не бывает иных всегда, когда функция нормальная функция вызывается. У неё есть 1 argument. With если этот this argument никаким образом не задан, то по умолчанию он всегда связан со значением undefined, подчер?
175: Undefined это не какой-то статус идентификатора, это конкретное значение на уровне языка, то есть this связано с каким-то конкретным значением, которое для нас.
176: Для удобства внутри языка называется словом андефайнд если мы вызываем любую нормальную функцию, то мы всегда знаем, что в момент вызова по умолчанию вис тут же определяется, как undefined.
177: Это правило без исключений.
178: А дальше начинается простой набор правил, который вас приведёт к общему, к тому алгоритму в своей голове, который будет вам всегда давать правильный ответ относительно того, с чем, чем, чему равняется ви, с чем он связан, мы находимся
179: Внутри новой, нормальной функции обычной нормальной функции, что мы должны сделать следующее после того, как мы оказались внутри неё, мы должны посмотреть, как эта функция вызывается.
180: Пример.
181: У нас задана функция do лок вис. В ней внутри вызывается консоль лок вис. Нас нам задают вопрос, чему, с чем связано, чему равняется вис внутри этой функции? Мы должны для себя сразу же в голове.
182: 1, это нормальная функция функшн. Да, это нормальная функция, да, нормальная, да, нормальная. Следующий щелчок. А как эта функция вызывается?
183: И мы смотрим, как она вызывается. Существует 1 способ задания зис явным образом. Это использование методов кол. Апплай и байнд это очень просто. Это методы, где мы зис задаём явным
184: Образом, то есть мы явным образом указываем, что функция do лок вис при вызове метода кол или кол, или метода аплай, или использовании метода байнд, который порождает новую функцию байнд фанкшн. Мы внутри этих методов можем задать вис.
185: Явным образом нам задали вопрос, чему равняется виз внутри долок вис? Мы вспоминаем, что нам нужно посмотреть, как эта функция была вызвана. Мы обращаем своё внимание на то, каким образом она вызывалась, и видим, что если это были способы вызова, типа
186: Call apply аплай, или созданная функция при помощи bind, то, значит with был задан явным образом и, значит, with равен тому, чему он был задан внутри этих 3 методов. Кол аплай, или bind, когда with задаётся явным образом, то есть
187: То первые простые 3 способа, каким образом можно вызвать нормальную функцию, у которой всегда есть минимум 1 argument with, и при этом этот vs можно задать.
188: Если мы видим кол апп, аплай или Байн, да, то тогда this равен значению из метода. У нас это у нас что у нас, какая страница 15, правильно? 15, да. Так вот этот наш пример.
189: И вот я этот пример сейчас вам показываю. То есть, согласно тому, что мы сейчас видим, и согласно этому алгоритму, который у нас существует, этот алгоритм строго зафиксирован в спецификации. Подчёркиваю, здесь нет никакого
190: Текста или не какой-нибудь магии.
191: Мы видим, что у нас вис аргумент, это я вот задал какой-то тут объект создал и вызвал 3 раза этот метод, применяя его к дулу квис. Вот мы смотрим здесь, че здесь такое сделал.
192: А, не понял.
193: Минутку. А, ну конечно, вот так. И мы видим, что во всех 3 случаях произошло именно то, о чем я и говорю. This argument был назначен, задан явным образом благодаря особой
194: Особым возможностям именно этих 3 методов все очень просто. То есть, если мы видим в момент вызова call апли или bind, то решение очень простое, зис всегда без исключения будет равно тому, чтобы
195: Передано внутри этих 3 методов. Ещё раз начинаем все сначала у нас спрашивают, чему равен this мы смотрим, мы находимся внутри функции или внутри обычного кода, если внутри обычного кода вспоминаем вот эту тягомотину из самого начала или просто
196: Просто говорим о том, что это встречается редко, надо посмотреть спецификацию и так далее. Оказавшись внутри функции, мы себя спрашиваем мы внутри какой функции находимся стрелочной или обычной, или не стрелочной. Если мы находимся внутри стрелочной функции, то начинается алгоритм с самого начала.
197: Опять мы спрашиваем, где мы себя находимся, идём по цепочке окружений, оказавшись в нормальной функции, которая определена как не стрелочная, мы сразу себе задаём вопрос, а каким образом эта функция была вызвана? Обращаем внимание 1 правило, которое перекрывает
198: Все остальные это вызов этой функции при помощи 3 методов, 2 методов вызова и 3 метод пересоздания этой функции с привязкой виз Кола плай ли Байн виз, заданный внутри этих 3 методов, всегда будет таким и только таким и переопредели.
199: Бить его больше нельзя.
200: Двигаясь дальше, следующее правило, после которого мы посмотрели на дуло квиз и обнаружили, что, например, это не call и не apply, и не байнд это вопрос, а мы видим нью ключевое слово нью.
201: Так, сейчас я, простите меня все-таки мне надо научиться как-то, как это правильно включать.
202: Ага, контрол ф, 5. Вот так это включается, получается.
203: То есть вызов произошёл не при помощи call, apply или bind, а вызов произошёл при помощи того, что перед ключевым словом, перед вызовом нашей функции стоит слово new да, я для вас подчёркиваю, это для многих может являться открытием нью это такое.
204: Интересное выражение в языке javascript, которое вызывает функцию при помощи слова new, мы можем вызвать практически любую функцию, за исключением тех самых стрелочных функций любую функцию совершенно неважно, какую вы хотите, это ни на что не влияет.
205: Кроме 1 единственного, ключевое слово нью делает так, что вызывается наша функция и with связывается с пустым объектом.
206: Вот наш алгоритм. Мы внутри вызова нормальные функции, да, видим ко плейли байт? Нет, видим нью, да, значит, with связан с пустым объектом.
207: Пример у меня здесь на этот счёт есть, а вот, кстати, извините, я вот сейчас, да, я пропустил, я его сейчас верну опять к call апи, аплай ли bind для того, чтобы показать 1 очень интересную штуку очень многие опять же думают, что this он
208: Всегда связан с некоторой структурой, очень сложной, объектной или какой-то ещё ничего подобного, ещё раз подчёркиваю, и это простой идентификатор. Он может быть связан с чем угодно. Используя кол аплай или bind, мы можем его связать и с любым примитивным
209: Значение, например, вот как в этом примере единичка вот 15 2 пример я запускаю, и мы обращаем внимание, что внутри нашей функции долок вис, которая вызвана при помощи методов кол аплай, или bind наш vs вот он.
210: Наш vs star вдруг простой обычной единичкой Ровно точно также мы можем эту единичку заменить и на какое-нибудь примитивное значение типа строки и увидеть тоже самое this это обычный идентифи.
211: С слегка особенным поведением, которое определяется только внутри вызова нормальной функции. Нормальная функция это функция, которая не является стрелочной функцией. Все, все не
212: Стрелочные функции являются нормальными функциями у этих функций всегда есть по умолчанию, всегда без исключений есть аргумент вис.
213: Установка этого аргумента зависит от обстоятельств 1 из этих обстоятельств это вызов при помощи явного, явного, явного их вызова Кола аплай, или bind, и передавать вы мы туда можем совершенно любой, хотите единичку, будет вам vs равна единичке, хотите её будет?
214: Хотите какой-нибудь объект, вот как вот здесь будет вам объект?
215: Возвращаясь к 16 где у нас new это то, что?
216: Всегда приводит к связыванию и с пустым объектом вот мы перепроверяем, как это выглядит отдельным образом обращаю внимание на то, что new это способ вызова функции, при котором зис связан с аргументом.
217: Пустого объекта, поэтому указывать круглые скобки для того, чтобы создавать именно call expressions, совсем не обязательно вы можете написать new и просто название функции, и будет Ровно тоже самое будет вызвана функция совершенно обычным способом.
218: И vs будет связан с пустым объектом, то есть 2 шаг после того, когда мы смотрим на вызов функции мы видим кол байнд или апп нет, не видим, значит явно задачи vs нету есть ли у нас слово new перед вызовом функции?
219: Если есть, то это означает, что наша вис внутри функции, внутри нашей нормальной функции связан с пустым объектом зис равно пустой объект. Или вот как мы здесь видим, вот так вот вот нам показывает вис пустой объект.
220: Двигаемся дальше. И здесь возникает вообще тот пример, который, с которого я с самого начала когда-то очень давно и хотел начать свою 1 запись.
221: Большинство задач.
222: На собеседованиях относительно того, чему равен this, по сути дела, крутится вокруг этого, и именно это и стало причиной того, почему очень многие люди думают, что якобы зис это контекст, он контекст, может быть в других.
223: Языках программирования, но не в языке javascript, зис и дот нотация, что за врот нотация, как я часто говорю.
224: Так.
225: Ничего не пропустил, да ничего не пропустил, переходим, переходим к 18 слайду с пояснением того, что такое дот нотация в языке javascript, дот нотации.
226: Называют синтаксис, когда у вас 2 идентификатора разделены между собой точкой. Пример, что-то точка, что-то чаще всего вы это сталкиваетесь с видом как объект, точка проперти свойство или
227: Консоли точка лог это дот нотация называется это официальный термин, присутствующий внутри языка javascript дот нотация, нотация, при помощи которой 2 идентификатора разделены между собой точкой, полным её аналогом синоним.
228: Является нотация, при которой вместо точки мы используем квадратные скобки и имя проперти, к которому мы обращаемся, указывается как строковый литерал в кавычках. Кому очень интересно. В презентации у меня есть ссылка по этом
229: Поводу можете перейти туда и посмотреть. То есть слово дот, нотация. На самом деле это просто такое странноватое немножко слово, описывающее ситуацию, когда мы видим в синтаксисе идентификатор точка идентификатор. А теперь что такое вызов?
230: Функции в dot нотации это когда у нас есть идентификатор, точка идентификатор и круглые скобки типа как вызов функции или следуя правилу того, что является синонимом дот нотации это идентификатор квадратные скобки.
231: В кавычках проперти круглые скобки это вызов функции в dot нотации, её ещё можно в спецификации увидеть как вызов метода от объекта в том числе, но самое главное из этого всего как с точки зрения правила это
232: Понимание того, что она вызывается как проперти от object, то, что мы привыкли разделять точкой точка это dot дот нотация, когда мы видим дот нотацию, это для нас сигнал.
233: И вот с этого момента заканчиваются все сложные правила относительно того, как понять, чему равняется зис, потому что, по сути дела, мы уже все перечислили. И смотрите, как все просто мы нас, нам задали вопрос, чему равняется зис? У нас вот
234: В этом коде внутри функции дуло квиз мы себя спрашиваем, мы видим в том месте, где она вызывается, call апли или байнд, или там раньше по определению нет, не видим, мы видим перед нашей функцией.
235: Которая вызывает этот код ключевое слово new нет, не видим, задаём себе вопрос функция вызвана в dot нотации, мы смотрим на эту функцию эта функция вызвана в dot нотации.
236: Вспоминаем, что дот нотация это история, когда команда записана как идентификатор, точка идентификатор. Здесь есть такое нет, ничего подобного нет, ответ нет, this равно undefined проверяем.
237: Себя идём. У нас в 19 пример. Вот он, наш 19 пример. Смотрим. 19 пример. This андефайнд.
238: Так интересно, а что будет?
239: Если наша функция окажется в dot нотации зис и дот нотация, то есть мы оказались в ситуации, когда да, то тогда this равняется тому идентификатору, который стоит перед точкой. Это стро.
240: Согласно спецификации, это не какое-то магическое правило, выдуманное, это так прописано в спецификации. То есть смотрим пример. Вот наша функция do лок вис, видите, которая все, что делает, как и раньше, это мы делаем консоли лок вис вис из with, вот мы создаём неко
241: Объект the object, да, у которого есть property name мурыч, к этому объекту the object property do лок вис. Мы просто добавляем новые проперти. Мы, мы его связываем с ранее определённой функцией дду лок виз и потом вызываем зе.
242: Object точка ду лок вис круглые скобки то есть мы вызываем функцию в dot нотации, как я об этом сказал раньше, это приводит к чему, согласно алгоритму, что with будет связан с the object, вот с этой точкой.
243: С тем, что являет, с тем, что есть перед, с тем идентификатором, который у нас есть перед объектом, смотрим на наш пример.
244: Смотрим на наш пример 20. Вот наш пример 20, о котором я говорил. И, согласно нашему алгоритму, у нас зис должен быть абсолютно эквивалентен, не эквивалентен, а связан с объектом зе обжект хали.
245: Идём дальше. Сейчас на примерах мы будем просто смотреть и видеть, как это все из 1 раза в раз. Все это повторяется. Алгоритм справа уже меняться не будет, он специально будет справа горет.
246: Для того, чтобы напоминать, как это работает слева будут только меняться немножко примеры. Пример, наоборот. У нас есть объект, внутри которого определён метод дуло вис как нормальная функция. Я подчёркиваю то, что я сказал в самом начале все изменения
247: With всегда связаны только с вызовом нормальных функций. А нормальные функции это функции, которые не стрелочные функции. И у нас происходит следующая штука. Ой ой ой ой, что я натворил. Происходит следующая штука. Мы создаём
248: Некоторый идентификатор дду лок виз глобал к который связываем с функцией с методом из объекта конст обжект зе обжект дду лок виз мы связали. Происходит вызов функции do лок виз глобал. Чему будет
249: Равен this, с чем он будет связан. Идём по нашему алгоритму. Мы видим кол аплиа нет, видим нью нет, функция вызвана в dot, нотации. Нет, with равно он дефайнит. Проверяем.
250: 21 пример.
251: Бдыщ ды, равняется андефайнд. Вот он, наш 21 пример, чтобы привести наглядно. Я сейчас раскомментировал строчку, где сначала я вызываю тот же самый метод, именно в dot нотации, и мы
252: Видим, что в случае дот нотации мы и получаем тот объект, который у нас был перед точкой. Идём дальше. Мы же не будем на этом останавливаться. Мы сейчас десятки примеров разберём, чтоб стало все ясно.
253: Да, пример наоборот 2 этот пример очень часто встречается на собеседованиях.
254: Мы видим, что у нас определён точно также объект, как он был определён в предыдущем примере есть property, есть у него метод дулоксетин, при этом у нас есть set timeout the object точка дуло вис, который должен вызваться через 1.
255: Человек, который прослушал внимательно и запомнил все, что я говорил выше, должен пройти опять по алгоритму сверху вниз у нас Кола плибей, нету тут ничего подобного на в этом виде нью, ничего подобного.
256: Не видим, функция вызвана в dot нотации мы не видим здесь вызова никакой функции, внимательно вызова функции здесь никакой нет, здесь есть дот нотация, обращение к проперти определённому, но вызова функции функция вызвана в dot.
257: Нет, значит, this равно undefined.
258: И сейчас я вам покажу сначала этот пример именно так, как я вам его описал, а потом я вам покажу 1 очень любопытный подводный камень, о котором не знают и чаще всего не, не говорят на собеседованиях. Я так очень любил всегда обла.
259: Этих людей 20. Какой у нас это 22. Нам нужен пример.
260: Undefined, пример 23 это пример, немножко наоборот, чтобы понять, что такое dot нотации, вызов, дот нотации вот обратите внимание, это точно такой же код, который был перед этим с той лишь разницей, что Комбина.
261: The object дуло квиз я сначала связываю с идентификатором и подставляю её в сет тайм аут это Ровно тоже самое что и было написано вот здесь, то есть вот этот код, где я в сет тайм аут передаю ссылку.
262: На функцию, используя дот нотацию и вот этот код, они абсолютно идентичны для java script и я подчёркиваю, каждый раз запомните, как функция вызвана не как к ней передали ссылку, не как на неё сослались, а?
263: Как функция вызвана, она вызвана при помощи call апли, или bind нет при помощи new нет, вызвана при помощи dot нотации, вызвана, ещё раз подчёркиваю, вызвана нет, death, равно undefined.
264: А теперь та штука, о которой, за которую можно было бы действительно убить джаваскрипт и назвать его странным там и так далее, и так далее, и так далее. Дело все в том, что очень многие не понимают.
265: А это 1 из первых важных частей вообще для того, чтобы понять, что такое javascript, нужно знать 3 вещи, и вы тогда разберётесь во всем джаваскрипте, это 1 о том, что джаваскрипт является встраиваемым языком, скрипто встраиваемым.
266: Скриптовым языком сам по себе джаваскрипт не существует, он не может существовать сам по себе, он должен быть куда-то встроен, он встроен либо в браузер, он встроен либо в ноду, либо в д. 8, либо в окружение чайника, он встраиваемый язык.
267: В связи с этим следует следующий вывод у джаваскрипта есть свой набор функций, которые определены спецификацией языка javascript, и есть набор сторонних апи, который позволяет языку javascript их вызывать все, что.
268: Я описал вам выше это строго согласно стандарта спецификации языка javascript, и касается его возможностей каша начинается тогда, когда мы сталкиваемся с api, потому что согласно
269: Стандарту языка java script любое апи может назначить вис так, как ему вздумается, нарушая все законы и все запреты самый простой способ показать это это вот способ, который связан с например.
270: Если мы в браузере, который является хост системой, используем api add event listener, то есть мы вешаем обработчик на событие click и привязываем туда дду хендл клик, то есть некоторую функцию, которая должна нам вывести.
271: То, согласно всем правилам и нормам языка javascript дду хендел клик должен иметь зис.
272: Каким?
273: Поскольку она вызвана не в dot нотации, то у нас зис должен быть.
274: Undefined, но если мы обратим внимание на то, каким образом это работает, а я специально здесь этот пример для себя подготовил, чтобы его показать.
275: Секундочку, вот он, да, да, это он, вот я его немножко крупнее сделаю. Сейчас вот это закомментируем, обновим это пример, где мы вешаем на body.
276: Слушателя события клик и вызываем наш дон клик в консоли. Мы должны получить какое-то сообщение в связи с этим вот я делаю клик и мы смотрим, мы видим клик йоу йоу.
277: Почему yo yo, действительно, почему yo yo должно же было быть? Я же обновлял, сейчас должно же было быть body.
278: Секундочку, а, блин, я тупица. Простите, я этот пример перенёс же уже прямо в этот.
279: В код этой страницы.
280: Сейчас, сейчас, сейчас. Да, вот он точно.
281: Вот я сейчас просто его отсюда закомментирую, чтобы он нам не мешал и не сбивал с толку.
282: Так, этот я плейграунд у себя уберу и оставлю только. Ага, ага. Обновление, проверка. Так, сейчас по клику не будет ничего.
283: Ещё раз ничего, правильно, правильно вот теперь мы выполняем этот код, и теперь по клику у нас будет body.
284: Вот.
285: Вызов нашего листера дду клик по какой-то причине вывело сообщение о том, что this связано с buddy, почему это произошло, а произошло это по той простой причине, что, согласно стандарту html 5.
286: Подчёркиваю апи адвент листенер обслуживает любой вызов обработчика события таким образом, что минутку я здесь специально даже ссылку себе делал.
287: Вот таким образом, что согласно этому апи при вызове этой функции, при вызове этой функции вот происходит вот описание внутри html 5, вот вы видите спецификация html.
288: 5 вот я специально открыл её на главе, которая описывает, каким образом должна быть вызван, вызван колбэк, который передан был в момент передачи туда add н. Листенер, и здесь он описывает процесс того, каким образом это происходит, в котором он.
289: Указывает о том, что
290: Какие, какие шаги должен предпринять алгоритм, реализующий это api для того, чтобы прийти к моменту вот вот он, наш момент call user object, оперейшен вес, визит, колбэк, эвент и передача туда.
291: Events курен тарджет это получается у нас 1 параметр хендл эвент и events Карен тарджет то есть кто является инициатором этого события и как только мы перейдём к следующей части спецификации опи.
292: Писывающий функцию, которая обслуживает вызов нашего колбэка, то мы здесь увидим, что у нас есть type, операция имени аргумент и callback вис велью, то есть.
293: В нарушение спецификации языка джава скрипт базового языка javascript api html 5 при обработке хендлера события click, согласно своей спецификации, привязывает к нашей функции.
294: This определённым образом.
295: Перепроверить это можно вот, наверное, другим вот образом. То есть, если согласно, опять же, возвращаясь к нашему алгоритму, который я вот здесь сверху вниз описывал. Вот смотрите, я сейчас в наш обработчик события передаю не просто наш докклик, как это было перед
296: Этим вот я его закрываю, а я передаю туда дду клик, который сделан с bind, то есть привязываю вис явным образом согласно нашему алгоритму, мы видим кол апли байнд да, значит, vs должен быть тем, который.
297: Назначен в нашем методе вот он, наш vs, назначенный в нашем методе иными словами, теперь глубоко фиолетово что там будет делать наша апи аштмл 5 да да, а по клику мы должны будем видеть всегда.
298: То, что мы привязали явным способом, вот оно и происходит.
299: Возвращаемся теперь к нашей этой штуке.
300: Другим прекраснейшим примером, иллюстрирующим тоже самое, является пример с тем самым сет тайм аут, на котором я очень часто обламываю всех людей, которые якобы понимают в том, что они очень делают, понимают, что делают вот этот вот пример 19 или какой 20.
301: Пример, по моему.
302: 22, да? Вот, например, вот этот 22. Возьмём пример. Если мы его будем вызывать в браузере, то будет или в 8, то будет происходить все согласно спецификации, при котором вы
303: Вызов по истечении 1 секунде 1 миллисекунды согласно спецификации а сет таймаут это отдельное внешнее апи будет приводить к тому, что vs у нас андефайнд согласно вот строго тому как мы прошли по алгоритму.
304: Но если вы возьмёте, вызовете тот же самый пример в ноде, то вы вдруг для себя обнаружите, что у вас this в ноде при выполнении сет тайм аут это какой-то любопытный объект тайм аут.
305: Почему? Потому что сет таймаут это внешнее апи и ghost среда, которая обеспечивает работу этого внешнего апи вольна делать свис, что ей захочется в нарушение всех правил, за исключением только.
306: Того что если мы vs назначили явным образом, то тогда ничего не произойдёт это очень показательный пример, опять же относительно того, что как только мы пользуемся любым внешним апи, то для того, чтобы быть уверенным как это api себя ведёт.
307: Вызывая любой наш callback вне зависимости от того, как он был вызван, за исключением явной передачи this, мы всегда должны читать спецификацию, если мы откроем нашу ноду, какую-нибудь спецификацию по ноде ноды джис вот да, я даже специально искал это и пере.
308: Идём в документацию по поводу таймеров, то мы обнаружим, что наши таймеры внутри ноды это на самом деле у нас, что это у нас на самом деле определённый класс, метод которого и вызывается, что вполне логично, что при вызове этого метода, как
309: Метода класса, то есть вызова в dot нотации мы получаем у нас вис как time аут, подводя краткие итоги очень простые итоги относительно всего того, что было сказано выше, сохраняя алгоритм теперь очень
310: Сильно упрощает, чтобы не казалось, что все это очень сложно для того, чтобы понять, чему равен this.
311: Чему равен this нужно всегда посмотреть на то.
312: Где вызывается эта функция, внутри которой мы узнаем, хотим узнать, чему равен this если мы находимся не внутри функции, то мы находимся либо в скрипте, либо в модуле если мы в модуле, то это undefined, если в скрипте.
313: Читаем спецификацию по ххос системе, которая может установить vs как ей хочется далее если мы оказались внутри функции, то 1 и единственное и важное правило это посмотреть как эта функция.
314: Была вызвана. А, ну да. Ну и перед этим, конечно, себя проконтролировать, является ли эта функция стрелочной или нет. Если эта функция не стрелочная, то тогда мы смотрим, как она вызывалась. Если эта функция стрелочная, то мы смотрим на родительское окружение. Итак, у нас
315: Функция не стрелочная. Мы смотрим, как эта функция вызывалась. А дальше все просто with задаётся явным образом при помощи 3 простых методов это все знают кол аплиа. Если мы видим, что были использованы 1 из этих 3 методов, то мы знаем, что with всегда
316: Будет равен тому, как он был назначен внутри этих 3 методов. Следующий вариант измените зис. Это ключевое слово нью, которое все привыкли видеть как слово, которое якобы создаёт у нас, вызывает конструктор. Мы создаём в нём новые
317: Объекты или это там новые классы и так далее, и так далее, и так далее. Но с точки зрения спецификации это ключевое слово нью, которое всего лишь навсего вызывает функцию, внутри которой она связывает зис с пустым объектом, если мы не
318: Видим ключевого слова new мы дальше смотрим, а происходит ли вызов функции в dot нотации дот нотация это идентификатор, точка идентификатор. Если да, то with всегда будет равен тому, что стоит перед точкой, это строго согласно.
319: Спецификации.
320: И если все мы эти 3 пункта прошли и ни 1 из них у нас не состоялся, то this равно undefined.
321: Перефразирую ещё раз по другому this это особый аргумент нормальной функции любая нормальная функция всегда вызывается минимум с 1 аргументом этот аргумент имеет название with как любое, как любая.
322: Другая переменная на примере. Все надо показывать на примере, когда мы
323: Создаём какую-то обычную функцию, да, и там дуинг сделать нечто и внутри задаём какой-нибудь параметр. Напишем так, де парам 1 то что
324: Мы про эту функцию можем сразу для себя сказать, что это есть нормальная функция, у которой, в которую можно передать 1 параметр, да, и что внутри этой функции у нас. Когда мы вдруг захотим работать с этим параметром, то с этим параметром может быть связано какое-либо значение.
325: В случае вызова этой функции, вот в такой вот нотации, да, у нас будет сейчас выведена в консоль единичка. Правильно? Правильно? Это просто так. Вот единственное, что нужно к этому всему дополнить, что у do think есть
326: Некоторый скрытый параметр with он скрытый, вы его не можете прям прямым образом передать, но он всегда есть у любой нормальной функции. То есть вот как будто бы у вас всегда есть 1 параметр. This он всегда есть, только что вы его не можете передат.
327: Путём вызова используя кол экспрешшн и единственный способ передать туда этот vs, это использовать особую форму вызова функции особая форма это кол апли ли bind, методы нью использует особую фун.
328: Форму или dot нотацию, при которой дду там какой-нибудь, какой-нибудь объект. Вот так вот, например, смотрите, даже object name
329: К которому как в примере, там вот так.
330: Вот так наш объект, которому мы назначаем любой метод, не имеет значения наш дуинг и вызов нашего теперь в dot нотации.
331: Метода приводит к тому. А, ну разумеется.
332: Остались. Приводит к тому, что он выводит вис, а вис равняется тому, что идёт переточка.
333: Это лишний раз в 500 раз. Подчёркиваю это не магия, так закреплено в спецификации, в спецификации, нет никакого понятия контекста, который бы связывался с vs в спецификации чётким образом описаны вот эти 3 случая.
334: Единственные 3 случая, при которых можно установить или связать с каким-либо значением зис вызов call аплиа вызов нью или вызов доп. Нотации во всех прочих случаях this либо undefined, либо это какая-то особая история с глобальной глобальным.
335: Окружение.
336: Да, ну и, конечно, ложечка дёгтя к этому всему это вызов наших функций из api, потому что тот же самый event listener сет таймаунт это внешний api, который в праве, не подчиняя.
337: Правилам языка javascript, и они имеют право назначать ивис, так как им вздумается это закреплено спецификации, там так прямо и написано, как и в случае с глобальным окружением прямо написано, что глобальное окружение, запуская наш код по
338: Молчанию должна установить vs, связанный с глобальным объектом, но если глобальному окружению очень хочется, то она может установить vs, так как ему хочется точно так же, как и с любой другой функцией вообще для людей, которые чуть более любозна.
339: Это любопытная аналогия, потому что, по сути дела, в джаваскрипте все это функции наш глобальный код, который, о котором мы думаем чаще всего как о глобальном коде и о глобальном окружении, это вызов точно такой же функции, её принцип работы и взаимоде.
340: Действие такой же, как и принцип вызова и работы любой другой функции, там есть некоторые детали, отдельные не это сейчас незначительно, но общий общая логика работы всего этого 1 и та же, и в случае как внешняя апи, имеет право назначить ви.
341: Так как оно хочет, так и ghost система, которая обеспечивает работу нашего кода в глобальное в глобальном окружении, тоже может назначить вис ему, как она хочет, но как только мы запускаем функцию явным образом и эта функция не стрелочная, она подчинена.
342: 3 простым правилам, к которым я в очередной раз не этот, не устаю возвращаться. Кол алибан, значит, то, что указано в колл аплиа нью, значит, пустой объект вызвано в доп нотации, значит то, что стоит перед точкой.
343: Никаких других исключительных операций этих историй не существует краткое тут из книжки слова dice это выражение языка javascript, поведение которого очень похоже на поведение идентификатора, с той лишь разницей.
344: То связать значение свис мы можем только особой формой вызова нормал фанкшн, то, о чем я сейчас говорил выше, что такое нормал фанкшн, поскольку способов определить нормал фанкшн большое множество. Проще всего о них думать как о функциях, которые отличаются от arrow function. Это
345: Абсолютная правда. По сути дела, у нас есть целая группа, большая группа функций с разными особенностями генераторы, методы и так далее, и так далее, и так далее, и так далее, которые отличаются, которые между собой объединены общей общим
346: Функционалом и все, что их отличает от чего-либо другого, это то, что они не стрелочные функции. То есть это все функции, у которых между аргументом и их телом функции отсутствует символьная пара стрелка. То есть это не стрелочная функция, какие формы меняют вис вызов
347: В любой нормал фанкшн по умолчанию связывает вис с undefined это аксиома как только вы видите вызов в любой форме нормальной функции, не стрелочной, вы сразу же знаете, что в момент вызова вис связан с undefined.
348: Ключевое слово нью, указанное перед вызовом функции, означает, что undefined меняется на пустой объект, используется call апли, или bind вы означает это означает, что undefined меняется на тот объект, который явно указан в call apple, или bind в случае вызова функции.
349: О нотации вы знаете, что undefined меняется на тот идентификатор, который идёт перед точкой все this i апи это особый случай, который никаким образом не разрешается, если какой-либо дурачок спрашивает на собеседовании задачку.
350: Связанную сет таймаут и требует объяснить, то ему можно показать простой пример с той же самой нодой, или браузером, или ещё чем-нибудь. У меня таких примеров очень много, который показывает то, что любое внешнее апи, а сет тайм аут это внешнее.
351: Api алист это внешняя апи и так далее, и так далее, и так далее, поведение зис в этом случае определяется спецификацией, и о нём можно только знать, выучить наизусть, то есть зайти в спецификацию и прочитать, где написано.
352: Что вот у нас такая спецификация в случае вызова обработчика, например, события, мы так установили, что при вызове вис будет связан, если with не был связан явным образом до этого с чем-либо другим, с таким-то значением.
353: Самый главный вывод vs javascript это не контекст он никогда не был контекстом, и быть им никогда не сможет в javascript есть контекст, но он никаким образом не связан с with и не будет никогда связан совершенно иная область.
354: Здесь джаваскрипт это особый идентификатор, и он подчинён тем же самым правилам, которые, по которым бы вы бы искали по областям. Как это у вас это называется, господи, области видимости это колхозный язык, потому что джаваскрипт не области, видимо,
355: Окружение по цепочке областей видимости или по цепочке окружений. Вы бы искали, где этот идентификатор в случае со стрелочными функциями? Сейчас я какой-нибудь пример покажу, изощрённый, чтоб было понятно.
356: Вот по умолчанию идентификатор, я напомню, что все примеры, которые мы смотрели перед этим, они все примеры, которые работают в strict mode, только в strict mode, в non strict есть несколько
357: Особенностей несущественных значение this для функции может быть изменено только в момент вызова этой функции и зависит от формы и способа вызова этой функции никаких других способов изменить зис нет внешняя.
358: Может связать ви с произвольным значением в зависимости от того, как ему надо. Теперь особенности поведения вис нон стрит не стрикт режиме. То есть если мы вызываем все те же самые функции вне стрикт режиме, это у меня что это 29 пример. У меня должен быть
359: Сделан, да, вот он, вот он, наш 29 пример. Сначала я посмотрю его, потом покажу, как это работает в том случае, если наш код выполняется в strict режиме.
360: То тогда with всегда связан с тем и появляется у нас всегда с тем, с чем он и был связан, без каких-либо неявных преобразований, в не стрикт режиме non strict mode with всегда проходит через обёртку ту обжект.
361: То есть, если мы находимся не в strict режиме vs всегда произойдёт, пройдёт выполнение некоторой виртуальной операции ту обжект перед тем, как она этот vs у нас будет продемонстрирован нам в нашу внешнюю среду, как это?
362: Выглядит. Это у нас какой? 29 пример.
363: Обратите внимание дуинг стринг стрикт вот функция в strict режиме которая у нас выполняется йоу как я prod, смотрите с самого начала опять по алгоритму разбираем байнд кол нет нет.
364: New. Нет, что у нас дот нотация. Правильно, правильно в dot нотации у нас что это означает, что внутри вызова нормальной функции? А это нормальная функция у нас вис должен быть равен тому, что находится перед точкой, перед точкой у меня you в
365: Режиме, а все примеры выше, о которых я говорил, это всегда стриктмод. У нас зис, это вот инстанс оф обжект, чтобы это было наглядно было понятно. Это не объект false. И это ооо, то значение, которое было в non стрит.
366: Режиме в non strict режиме. Отличие заключается в том, что with перед тем, как он, оно возвращается в качестве результата обслуживания выражения, проходит через виртуальную операцию, ту обжект, то есть любой
367: Примитивное значение будет преобразовано к объекту путём использования его конструктора. Вот здесь вот у нас был вот он string оо, это объект string. Если мы здесь воспользуемся, например,
368: Возьмём там единичку, там, там 12 вот так вот то мы сейчас увидим здесь объект, что такое? А, ну да, конечно, потому что я ж здесь функцию то определил для
369: Для строки, вот для, для объекта цифра мы увидим объект 12 и так далее. То есть отличие нон стрикт режима от стрикт режима заключается в том, что при возвраще
370: Значения при вычислении выражения with в strict mode это всегда будет именно то, что было и связано с vs в non strict mode, это будет нечто, что пройдёт сначала через виртуальную функцию ту обжект, то есть
371: Если там будет не объект, а какое-то примитивное значение, то это примитивное значение сначала будет пропущено через конструктор.
372: Вот, собственно говоря, и все отличия стрикт от non strict.
373: Да, и показать какой-нибудь пример, связанный со стрелочными функциями, чтоб более наглядно было понятно, как это работает. Вот мы создадим сейчас быстренько.
374: Подожди, а у меня разве не было здесь этих примеров, готовых?
375: Да, вот можно хотя бы на этих же примерах показать, чтобы не писать сейчас ничего. Вот смотрите пример.
376: У нас вызывается функция do лок вис. Вот наша функция определена, точнее так идём от обратного. Нам нужно понять, чему равен this. Вот в этой ситуации мы находимся вот здесь, мы спрашиваем себя, где мы находимся, мы находимся в нормальной функции или в стрелочной функции.
377: Функции мы находимся в стрелочной функции. Стрелочная функция это ненормальная функция. Согласно нашему алгоритму, который у нас зафиксирован опять же строго в соответствии со спецификацией вернёмся, где у нас на начало
378: Да, вот это вот, вот.
379: Так вот, если я нахожусь внутри стрелочной функции, то я должен перейти к родительскому окружению и начать все сначала. То есть я должен сделать вид, что у меня никакой стрелочной функции вот здесь вот нет.
380: А как будто бы этот в консоли как будто бы этот vs вычисляется так, как будто бы он находится во внешнем окружении без определения стрелочной функции теперь я нахожусь в какой функции в нормальной функции не стрелочной значит vs у нас чему равен?
381: Это стрелочная функция ко Алибай нет, new нет, дот нотация нет, with равно undefined проверяем?
382: Это у нас пример 12 1.
383: Under Фанит?
384: Другой пример внутри функции do лок вис мы вызываем стрелочную функцию, которая определена в глобальном окружении.
385: Опять следуем нашему алгоритму следует вопрос с чем связан выс внутри вызова стрелочной функции do a thing, которая вот вверху мы себя спрашиваем мы находимся внутри нормальной функции нет, мы внутри стрелочной.
386: Функции, что значит мы должны сделать? Перейти к родительскому окружению. Вот мы внутри стрелочной функции родительским окружением для стрелочной функции. В данном случае, что является правильно глобальное окружение, в которое она была определена, не то место, где она была вызвана, а то
387: Где она была определена. То есть это равнозначно тому, как это был бы вызов, если бы никакого определения для стрелочной функции не существовало, а был бы просто консольлог вис для нас родительским окружением для стрелочной функции является глобал инвай.
388: Согласно нашему алгоритму, вот мы в стрелочной функции перейди к родительскому окружению начать все сначала мы перешли к родительскому окружению и начинаем все сначала. Вот я внутри функции нет значит я должен узнавать правила.
389: Чему равен this в случае скрип скрипта или модуля? Ну а там мы помним, что если это скрипт, это undefined, если модуль, как душа, положила создателям хоз системы по умолчанию глобальный объект?
390: Более ещё сложный пример. Вот по поводу 12 2, чтоб было ещё более понятно. У нас, например, есть созданный какой-нибудь объект
391: Внутри этого объекта у нас есть какой-то метод do say её
392: Name. Не знаю почему так, пусть будет так. И это у нас будет нормальная функция и внутри этой нормальной функции мы вызываем нашу стрелочную функцию.
393: Которая определена выше.
394: Вот она, вот так вот и вызываем наш метод путём вызова дот нотации.
395: Начинаем рассуждать опять, согласно тому алгоритму, который я показал выше, чему равен this внутри нашей вот этой вот функции. Мы находимся внутри нормальной функции. Нет, мы находимся внутри стрелочной функции, значит,
396: Мы должны перейти к родительскому окружению и задать себе этот вопрос, снова перейти к родительскому окружению. Что означает мы удаляем любую вот эту вот всю нотацию, связанную со стрелочной функцией, смотрим так мы в родительском окружении, в роди.
397: Окружении. С чем we связано? Мы находимся, где мы сейчас находимся в глобал инвайрментал по умолчанию. Если это не Нода, например, то это будет у нас глобальный объект.
398: Несмотря на то, что здесь изначально метод do say your name вызывается в dot нотации, нас совершенно не трогает, потому что нас волнует только 1 каким образом происходил вызов той функции, про которую
399: Мы выясняем, где наш выс, поэтому в этом случае сейчас мы так вернёмся. Вот так.
400: Вы, у нас будет равен глобальному объекту в случае, если это будет выполнено в браузере, что у нас там какая-то пример, это у нас пример 12, 2, 12, 2.
401: Глобальный объект. Если мы будем находиться в ноде с тем же самым примером, то это будет пустой объект, потому что Нода по умолчанию имеет своё собственное поведение для определения вис в глобальном глобальном окружении.
402: Все очень примитивно просто vs где я в нормальной функции нет, я в стрелочной раз я в стрелочной функции, значит я должен узнать с чем связано вис в родительском окружении, что такое родительское окружение это то место, где функция?
403: Была определена не где вызвана, а где её родили, родительское окружение, где она была определена, функция до эро Финк определена в глобал инвайрментал, т. Оно равно там, чему тому, что был глобал.
404: Например, дусей нейм мы здесь определим ту же самую стрелочную функцию, теперь уберём её из глобального окружения и поместим её теперь в окружение нашей функции.
405: Так, так. И здесь вызовем эту функцию, что у нас происходит Ровно точно та же такая же цепочка рассуждений, выс находится в нормальной функции. Нет, это стрелочная, значит, мы должны посмотреть родительское окружении.
406: Для нашей стрелочной функции do error, sync, что является родительским окружением для do error sync это функция do say нейм. То есть мы оказались внутри окружения функции do say нейм. Эта функция нормальная. Да, эта функция нормальная, значит, чему this равен, this равен.
407: Тому, чему он равен внутри этой родительской функции. Эта родительская наша функция, она здесь имеет, какой with. Мы должны посмотреть, как она вызвана. Наша дуса и name вызвана при помощи dot нотации. Значит, здесь, with будет равен тому, что находится перед точкой.
408: То есть вот эта вот операция выведет консоль висис и ссылаться будет на объект the object. Проверяем.
409: Нифига себе, как просто, да.
410: Никаких контекстов, ничего придумывать не надо, все просто и примитивно, и как это как полено, за что я и люблю javascript. Я сам по себе человек очень недалёкий и тупой. У меня очень этот маленький объём оперативной памяти в башке, благодаря которому я
411: Могу что-то запоминать, именно поэтому я очень сильно люблю язык ассемблера, потому что он простой и примитивный, там очень много ничего помнить не нужно. Тоже самое, за что я и люблю язык javascript, он максимально логичен и максимально прост, и все его концепции проистекают.
412: 1 из другого, понимая общий принцип, можно ответить на любой вопрос, даже не зная, в какой конструкции мы находимся. Смотрите, я вам сейчас ещё покажу 1 пример. Пусть у нас есть 2 объекта, 1 объект.
413: Чтобы стало ещё яснее и
414: И будет супер объект какой-нибудь в 1 объекте. 1 объект у нас будет возвращать.
415: Нашу функцию стрелочную, то есть он не будет говорить дусей нейм, он просто будет возвращать эту функцию, а мы её назовём. Так, return, function. Так её назовём, чтоб было для нас понятнее. А вот
416: Вот этот вот будет принимать.
417: Какую-то функцию.
418: И внутри себя её вызывать вот так вот вот так вот и теперь мы делаем следующее the super object do say нейм вызвать.
419: А туда мы передаём функцию зе обжект вот этот ретан функшн, вот так вот.
420: То есть логика, в чем super object дунейм принимает на вход в нормальную функцию идентификатор ссылку на другую функцию её у себя вызывает вопрос чему будет равен this в этом случае?
421: Начинаем рассуждать, как обычно, по тому алгоритму мы должны узнать, чему равен this внутри вот этой нашей a function, потому что это она возвращается в вот это вот the object, return function у нас возвращает нашу дду ару фанкшн. То есть вот здесь вот
422: Называется наша a function, мы оказываемся здесь, мы внутри нормальной функции. Нет, это у нас стрелочная функция. Что это значит, что мы должны посмотреть на родительское окружение, ещё раз подчёркиваю, на родительское окружение.
423: Родительское окружение нашей a function. Какое это функция, которая привязана вот рету фанкшн, вот оно.
424: Чему равно родительское окружение в тот момент, когда мы здесь делали в object return function?
425: Все очень просто, и этот алгоритм работает везде и везде одинаково, ничего больше выдумывать не нужно.
426: Че за ошибка?
427: Ну да.
428: Нету.
429: Че тут?
430: Натупил.
431: А, ну конечно, господи, нет, не конечно.
432: Да, да.
433: Че то туплю, не могу понять сейчас почему?
434: А, тьфу, господи, ну конечно, идиота кусок. Вот.
435: Ещё раз проходим по цепочке, потому что я чувствую, что из за моего тупняка у людей могло в бошку чертешо возникнуть. Мы вызов the object return function. Вот вызов этого метода у нас вот on return function, наш метод мы возвращаем наш.
436: Стрелочную функцию. Так эту стрелочную функцию мы передаём в объект, в метод дунейм другого объекта.
437: Этот метод создан при помощи обычной нормальной функции. То, что мы передали внутрь там же внутри и вызывается чему равно do thing мы рассуждаем опять чему вот мы мы туда передали что-то что пришло при вызове return function.
438: То есть мы перевели туда вот эту нашу стрелочную функцию. Вот наша стрелочная функция, чему здесь равно this это, это нормальная функция? Нет, стрелочная, да, значит, нас волнует, в каком окружении она была создана.
439: А именно чему равен this в этом окружении зис, в этом окружении чему был равен, мы смотрим эта функция для, для того, чтобы создать нашу стрелочную функцию, вызывалась в dot нотации, раз вызывалась в dot нотации, значит, this равен то тому, что стоит.
440: Перед точкой, то есть когда мы пришли сюда для того, чтобы вернуть нашу ару фанкшн, у нас зис был эквивалентен зе обжект, значит, this внутри ару фанкшн ссылается на the object, значит.
441: Вот здесь do inc. Вызов он сделает в консоли лог зе обжект проверяем.
442: Name мурыч, сделаем вот так. Вот, the object мурыч будет the object мурыч вот он, несмотря на то, что он вызывается внутри метода другого объекта и так далее, который тоже вызван в dot нотации, все очень просто.
443: Итого кратко, ещё раз по тезисам.
444: Существует всего лишь 3 момента, при помощи которых определяется this все эти 3 момента связаны строго с тем, как вызвана функция.
445: И какая функция? Если эта функция стрелочная, то мы должны посмотреть на родительское окружение, как оно было вызвано. То есть как будто бы посмотреть выше, ну как поискать переменную по областям видимости, как вы привыкли об этом говорить, если это нормально.
446: Функция, то мы должны посмотреть, как эта нормальная функция вызывалась. Вызовов вызова нормальной функции существует всего лишь 3 типа. Это явный, это вызов с явной задачей вис при помощи способов кол аплай или by
447: И тогда this будет всегда равен тому, что указано в этих методах, 2 способ это использование ключевого слова new, и тогда this будет всегда равен пустому объекту, и 3 способ это вызов функции в dot нотации, и в этом случае this.
448: Будет всегда равен тому, что стоит перед точкой.
449: Больше никаких правил определения зис не существует, не существует никаких контекстов, никаких потерей контекста, никакой магии, ничего подобного, что я и пытался показать на всех этих примерах, и
450: Всем остальным. Вот собственно говоря и все, что у нас тут, я в конце говорил так, ну особенности в non strict mode. Это нужно знать тем, кто продолжает поддерживать старый легаси код для того, чтобы знать это в
451: Не стрикт режиме зис, перед тем, как он приходит к нам в нашу обработку, обязательно проходит через виртуальную функцию ту обжект, то есть примитив, любое примитивное значение будет преобразовано к объекту в strict
452: Наш vis может, может быть и примитивным значением. Мне очень нравится всегда этот пример показывать, потому что он людям ломает мозг, и они до конца не понимают, что происходит с когда им это делают, где
453: Это у меня пример 29 да да, во первых это пример прекрасный, который иллюстрирует 1 из моих предыдущих видео о том, что примитивных типов джаваскрипт не существует и когда вам говорят о том, что numbers
454: String и так далее это примитивный тип, это чепуха на постном масле, и этот пример прекрасный тому прекрасная тому демонстрация, когда я определив в прототипе объекта особое его поведение, например вот для числа намбр для объекта number.
455: Типе я определил некоторое поведение ду синг, которое мне выводит при вызове этого метода, применимого к этому объекту, вот подобного рода строку и потом вот применяю к обычному примитив велью
456: Мой метод и и что оказывается что он прекрасно у нас
457: Минутку, я где?
458: Это.
459: Не 16, а 29. Господи, пример 29. Вот и пожалуйста, в non strict mode это наша 12 было обёрнуто в объект, если я здесь укажу рантайму, что это должно выполняться.
460: В strict режиме, то я просто получу вис равное 12, вот оно, пожалуйста, with равно 12 foals, это специально я показываю для того, чтобы было видно, что что значение, которое вис приходит сюда, внутрь этой функции, не является тем, что
461: Можно было бы назвать наследником от объекта, а является все тем же примитив велью если его убрать, то мы будем просто видеть 12.
462: Вот.
463: Такие дела. Так это я рассказал про стрикт, это я сказал, это можете обращаться, читать.
464: Многие тестовые части, связанные с книжкой и со всем остальным, в 1 очередь пробуются и тестируются в telegram канале, который вот там вот написан.
465: А я потом в описании запишу ещё раз по другому скажу у тех, у кого сейчас какой-то сумбур в голове, и всем кажется, что это за страшный набор всего происходящего. В большинстве случаев вы когда будете смо,
466: На любой свой код для вас будет стоять 1 единственный вопрос, который вы себе будете всегда задавать, в какой нотации была вызвана функция в dot нотации или не в dot нотации, потому что обычно в других случаях вы всегда знаете, что эта функция была какая-то особ.
467: Которая была вызвана как call апли или байнд это какой-то особый случай new это всегда вы знаете, потому что это у вас создание нового объекта или класса и так далее, и так далее и так далее. Это все специфические вещи, а в большинстве других случаев вы всегда вызываете функцию либо в обычной нота.
468: Как просто doing либо в dot нотации, когда у вас есть некоторый объект точка проперти, и определение тому, чему равен this, всегда очень простое, оно равно тому, что стоит перед точкой.
469: За исключением особых случай случаев, которые имеют более высокий приоритет, а более высокий приоритет имеет у нас call апи, или байнд, или new, все, больше ничего нет, никаких контекстов, ничего другого.
470: Понять эту тему относительно, особенно ситуации с поиском по окружениям, намного проще, когда понимаешь, что
471: Каким образом на самом деле разрешаются идентификаторы. Но это уже отдельный разговор. Это вообще не про это даже не запоминайте. Так, не пропустил ли я чего. Сейчас я по чек листу посмотрю про сет тайм аут. Я вам рассказал, как он в ноде и в этом отличается про
472: Api я вам рассказал да, запомни для себя, что вызов api любого стороннего апи это всегда означает, что зис может быть чем угодно, что захотелось автору апи.
473: А автор апи это автор того, кто делал окружение браузера, ноды или чего угодно. Дальше про non strict я вам сказал сет тайм аут, вроде бы я ничего не забыл.
474: Все самое главное, сказал и проговорил более простым языком вот и все.
475: Что за рот нотация надо было так видео и назвать. Поэтому возвращаясь к стишочку хочешь знать чему веро равняется проверь как твоя функция запускается, вот и все.
476: Если у кого-то какой-нибудь вопрос по этому поводу есть.
477: То давайте иначе я буду завершать, потому что хочу ещё перезаписать все это на украинском языке, словно Бо украинскую мо.
478: Проверь, как и какая функция запускается. Ну и вот простой алгоритм, а можно ещё ссылку прикрепить на все эти алгоритмы, на эту презенташку.
479: Чтоб можно было самим полистать.
480: Да, я так и сделаю.
481: Настройки доступа.
482: Копировать ссылку.
483: И да, сейчас её в описании там размещу. Ну, тогда всем спасибо. В следующий раз уже, наверное, будет 1 глава того, о чем
484: Я и хотел сделать книжку, то есть то, каким образом и нужно изучать язык джаваскрипт в языке javascript, вообще практически все, что вы знаете, устроено вот таким вот простым способом, очень простым, и оно все проистекает 1 из другого, там нет вещей.
485: Которые были бы нелогичны, которые были бы не связаны. Бывают некоторые исключения, связанные с какими-то особенностями этих. Но это совсем не то, что встречается у вас чаще всего в работе. И вообще не то, о чем вам говорят в каком-нибудь стриме, где рассказывают. Ну это ж джаваскрипт, вы же понимает.
486: Он так работает, потому что это ж язык, который недоразвит, нелогичен и так далее. Вот практически все из того, что я сколько раз слышал, совсем недавно это было.
487: Сейчас я покажу.
488: 1 из людей, которого, которого я рекомендовал слушать.
489: Я случайно нашёл его, случайно, совершенно попал на его
490: Выступление четырехлетней давности на холли джи эс.
491: Где он себе позволил похожее высказывание на тему ну это ж java script вы же понимаете, а на самом то деле все работает иначе сейчас где же оно тут было у меня сейчас я
492: Покажу.
493: Как раз очень показательный пример относительно того,
494: Как человек, с 1 стороны, говорит пренебрежительно языке, а с другой стороны, это показывает, что он просто совершенно неправильно понимал, как это все происходит.
495: Че то я не могу найти у себя это в истории. Ага. Вот прекрасно. Да, Кирилл Черкашин. Очень люблю этого человека. Рекомендую вам всем смотреть его видео. Несмотря на то, что он здесь, надопускали. Ошибок очень много, но ему нельзя никогда отказать.
496: В том, что он всегда пытается разобраться до последнего. Так и вот в этом его видео, здесь он рассказывает про то, зачем он использовать. Может аст, аст, дерево, и он завернут так называемый так.
497: И это все завёрнуто в так называемый мембер экспрешен. Дети сейчас это вот это место, по моему. Кстати, у меня сейчас показывает парсинг. Э, то, что, да, да, да, да, да, да, да. Так.
498: Сейчас, сейчас, сейчас я как раз перейду к этому месту, да, и, ну, допустим,
499: Да да да, это вот оно что здесь происходит он рассказывает о своей теме зачем ему нужен парсер ast дерево, и прежде чем приступить к описанию происходящего, показывает, как парсер разбира.
500: Выражение языка java script каким образом он их идентифицирует у себя согласно спецификации и вот он говорит сейчас, что вот, например, тру тру.
501: Та программа, которая у неё занимается интерпретацией, переводит на язык спецификации, как буллион литерал, что является абсолютной правдой с точки зрения спецификации. Дальше слушайте, это
502: Сейчас я сейчас, чтобы, ага, вот здесь, да, все правильно, Булин литерал, что логично и правильно. Согласно спецификации несколько человек. Потом подойдите, я вам дам за смелость, просто стикер, то, что из за адекватность, то, что it
503: Имеет смысл, потому что нам, например ага, вот сейчас я пропустил, сейчас я вот так вот начну отсюда, начну вот отлично. И, ну, допустим, вот он спрашивает о том, задал вопрос в публике. Типа true это что с точки
504: Зрения спецификации тру это буллион. Литерал. Ну это такая, не морочьте себе голову с запоминанием. Это особая такая конструкция, описывающая часть языка, так?
505: Кто думает, что undefined? Это и из зала следует вопрос а что такое undefined, если true это буллион литерал, то что такое undefined литерал?
506: И он спрашивает у публики как вы думаете, если true это Булин литерал, то undefined это какой литерал? Окей, несколько человек, потом подойдите, я вам дам за смелость просто стикер, потому что и за адекватность то что это имеет смыс.
507: Потому что null, например, это и дальше он начинает развивать ответ на этот вопрос, пока ещё не давая, не показывая, как на самом деле его интерпретирует аст. Вот он говорит вот, например, null это null литерал, как и true, это були литерал, это на литера.
508: Но если кто думает, что в javascript, undefined будет undefined литерал, то да, это имеет смысл нет, конечно, и вот он говорит, если кто-то думает, что undefined джаваскрипт это undefined литерал, то не так, потому что java script, потому что, типа, на самом деле это не так, потому что это
509: Скрипт, и он видит, что ответ у него от его интерпретатора, что undefined это идентиф идентификатор праймери экспрешн, а теперь пример того, что вот, казалось бы, он логически
510: Последовательно, логично рассказывает и объясняет то, что происходит, и потом говорит вот смотрите, какое прелюбопытнейшее поведение языка javascript, которое андефайнд интерпретирует как идентификатор я напомню, что идентификатор
511: Это вот вы пишите например там var let const неважно конс там my там что там неважно что 1 my это идентификатор точнее говоря my это имя идентификатора.
512: Которая, которая связывается с внутренней структурой, которая является идентификатором. И вот он спрашивает у своей, у системы, что такое null, она ему говорит, что null, это особый тип языка, который
513: Называется синтаксиса языка, которая описана в экма скрипт спецификации как null литерал, так оно и есть в спецификации, если мы зайдём в экма скрипт.
514: И здесь напишем нал.
515: То мы здесь увидим, что внутри
516: Вот он синтаксиса, описывающие литералы неважно, что это сейчас такое, это не принципиально, есть именно null литерал тоже самое происходит с тем, что если мы пишем true или false, это все типа это булиан литералы, а потом
517: Мы вдруг пишем андефайнд.
518: И вместо того, чтобы это значение, к которому мы привыкли как специфическому специальному значению, вместо того, чтобы увидеть там тоже, что это является литералом, частью языка, мы там вдруг видим сообщение о том, что это обычный идентификатор как mma.
519: После чего идёт ироничное замечание о том ну это ж джаваскрипт, вы же понимаете, у него все через задницу, на самом деле же нет.
520: Потому что если человек знает логику того, каким образом джаваскрипт работает, то он бы знал, что undefined это у нас что правильно, это у нас часть глобального объекта.
521: Дефайнит.
522: Вот глобальный объект, согласно спецификации, имеет некоторый набор своих пропертис, методов и этих, в том числе и undefined, если вы в любом глобальном объекте, вне зависимости от рантайма, например.
523: Если мы сейчас в браузере обратимся к глобальному объекту и спросим, если проперти н дефайнит, то мы получим, что оно здесь есть по другому. Можем посмотреть рефлект ан.
524: Has own property виндоу андефайнд?
525: Минуту.
526: Минуту сейчас, сейчас, сейчас, потому что это не own property, то есть не личное проперти виндоу это наследование от этого, от от реалма а что у нас у windows?
527: Windows кто у нас там в прототипах?
528: Windows у нас в прототипах тогда почему сейчас, а у него кто прототип виндоу пропертис?
529: А у него вентаджет.
530: Так, подожди, глобал вис. Да, да.
531: Global vs андефайнд, подожди.
532: Так чтобы сейчас я че то на каком-то опять моменте затупил это для меня свойственно d undefined тут это не принципиально сам факт того что о чем мы говорим, а принцип.
533: Принципиально то, что undefined, это обычное проперти.
534: Внутри глобального объекта. Вот что я вам пытаюсь показать именно по этой причине. А мы знаем, что глобальный объект это объект, который имеет отображение в глобальное окружение. То есть если мы заводим какой-нибудь идентификатор, там, например, в глобальном окружении,
535: Именно через вариейбл степен вар мурыч, там равно 6 6, 6, то в нашем глобальном окружении будет от появится проперти мурыч Ровно точно также и
536: И именно по этой причине, когда он внутри своего собственного видео спрашивает у системы, которая оценивает, что является той или иной конструкцией для языка андефайнд и она ему выдаёт идентификатор, а не литерал, это связано.
537: Тем, что в любой части кода, где бы мы не обращались, андефайнд, произойдёт поиск по цепочке идентификаторов снизу вверх, дойдя до глобального объекта.
538: Где андефайнд, согласно спецификации, является проперти к этому глобальному объекту, что вот здесь вот и за что вот здесь вот у нас и закреплено вот глобальный объект валио проперти глобал обжект, в отличие от null.
539: Там и так далее, и так далее, и так далее. И поэтому здесь ответ не в том смысле. Это ж джаваскрипт, тут ни черта не понятно. А здесь ответ в том, что почему вдруг андефайнд оказался в части глобального объекта. Объяснение этому очень простое, потому что с незапамятных времён
540: Было принято андефайнд связывать с теми значениями, которые удобно программисту и undefined можно переопределять или преопределять в зависимости от того, какой хост средой ты пользуешься, на согласно тому значению, которое тебе нравится, а не тому.
541: Задумал рантайм, но так было когда-то очень давно. Сейчас, конечно, уже это делает очень мало кто по этой причине андефайнд и остался частью глобального объекта, как что-то, что можно было бы переопределять на то значение, которое тебе нравится.
542: И так далее. И вот все парадоксы языка джаваскрипт, которые чаще всего в подобных видео рассказываются, они все очень логически объясни, объясняются, там нет никакого особого поведения.
543: Презентацию сейчас я прикреплю.
544: Сейчас я презентацию прикреплю к ссылку на презентацию прикреплю к описанию этому видео, на том и закончим. Говоришь, очень тихое видео. Я, блин, наоборот, старался с самого начала сделать так, чтобы оно было по звуку очень нормальное, а ты говоришь очень тихое. Парадокс.
545: Ну, я ж такой специалист, я ж самый главный стримлер на свете. Так, ну тогда я буду сейчас завершать и прикреплю туда ссылку на презентацию к, ха, а из презентации у вас не получится взять примеры, они здесь картинками.
546: Надо придумать какой-нибудь файл, где бы эти все примеры были. Ну или их можно просто так почитать.
547: А видео с кириллом тьфу ты, блин, это ж я просто громкость не выкрутил.
548: Да, а примеры, примеры, я их, наверное, куда-нибудь просто положу, потому что я начал делать для красоты, и чтоб была подсветка. Я сюда эти все примеры скриншотами вставил, их отсюда не скопируешь, поэтому надо будет просто в какой-то файл, я сложу эти все примеры.
549: Ну, они очень простые, их очень легко пересоздать. Так, ну теперь точно все финальные. Я подвожу итог всему этому ещё раз.
550: This устанавливается только в момент вызова нормальной функции нормальная функция это не стрелочная функция, других способов установки зис не существует, то есть, если нам нужно понять,
551: Чему равняется зис? Мы должны посмотреть, внутри какой функции мы находимся. Если эта функция стрелочная, то мы должны перейти на окружение выше к родительскому окружению. Если эта функция нормальная, то мы должны перейти к той строке, где функция вызывается, и посмотреть.
552: На то, как вызвана функция, функция может быть вызвана 3 разными способами вызовов вообще функции гораздо больше, но в контексте this у нас волнует только 3 способа это кол аплиа если да, то this.
553: Прямо определён внутри этих 3 методов кол апли или Байда, если это new to this, связан с пустым объектом, если это дот, нотация, что-то точка, что-то круглые скобочки, то with всегда будет равен тому, что стоит перед точкой.
554: Во всех иных случаях with равен undefined для стрикт мот, для non strict он равен глобальному объекту, вот и вся простая логика, несмотря на то, что я так это долго и много рассказывал все, друзья, спасибо, очень скоро появится 1.
555: Запись 1 1 главы, которую мы сначала, конечно же, попробуем в telegram по поводу моего самого гениального, неподражаемого и шикарнейшего курса, описывающего джаваскрипт.