Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр
Начните с маленькой подводной лодки: устанавливайте бомбы, избавляйтесь от врагов и старайтесь не попадаться на глаза своим плавучим врагам. Вас ждет еще несколько игровых вселенных, много уникальных сюжетов и интересных загадок.

Пикабомбер

Аркады, Пиксельная, 2D

Играть

Топ прошлой недели

  • AlexKud AlexKud 38 постов
  • SergeyKorsun SergeyKorsun 12 постов
  • SupportHuaport SupportHuaport 5 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня

Javascript + Обучение

С этим тегом используют

Программирование IT HTML IT юмор Программист Frontend CSS Образование Учеба Урок Английский язык YouTube Все
85 постов сначала свежее
alllhimic
alllhimic
2 года назад
Халява

MIMO Pro на 7 дней (без карт и т.д.)⁠⁠

MIMO Pro на 7 дней (без карт и т.д.) Бесплатно, Халява, Скидки, Услуги, Mimo, Приложение, iOS, Android, Обучение, Программирование, IT, Python, HTML, SQL, Javascript, Программист, Лайфхак, Экономия, Видео, Длиннопост

└ Источник: FREEHUB (халява в твоем кармане)
➖➖➖➖➖➖➖➖➖➖➖➖
▪️ ПОЛУЧИТЬ | 199₽

💁🏻‍♂️ MIMO Pro — это платформа создана для онлайн-обучения программированию, вы можете научиться писать код, создавать приложения, игры, сайты, и многое другое, уделяя занятиям всего 5 минут в день, освойте HTML, CSS, JavaScript, SQL, Python и другие языки программирования » FREEHUB расскажет вам, как создать аккаунт с PRO-функцией на 7 дней, а после того, как период закончится, вы можете создать новый аккаунт и так далее.

➖➖➖➖➖➖➖➖➖➖➖➖

┌ BIN: 5391506005

├ FECHA: RND

├ CVV: RND

└ IP: RND
➖➖➖➖➖➖➖➖➖➖➖➖

🤷🏻‍♂️ ЧТО НУЖНО ДЕЛАТЬ:

1. Открываем » MIMO.

└ Регистрируем профиль

2. Используйте » Temp Mail.

└ Чтобы не засорять Email

3. Открываем » MIMO Trial.

└ Оформляем подписку

4. Открываем » NamsoGen.

└ Генерируем карту (см. BIN)

5. Завершаем оформление.

└ Проверяем подписку

6. Готово, Pro на 7 дней.
└ Если вы не поняли инструкцию, тогда ниже посмотрите видеоинструкцию, где все наглядно и детально показано:

➖➖➖➖➖➖➖➖➖➖➖➖

🔥 Подписывайтесь на Telegram: 👉🏻 FREEHUB 👈🏻

└ Чтобы не пропускать подобную халяву ❤️

Показать полностью 1
[моё] Бесплатно Халява Скидки Услуги Mimo Приложение iOS Android Обучение Программирование IT Python HTML SQL Javascript Программист Лайфхак Экономия Видео Длиннопост
6
Javascriptizer
2 года назад
Лига программистов

Вторая неделя учёбы завершена // Джаваскриптизёр⁠⁠

Несмотря на проблемы с электроэнергией и ленью, я выкладываю следующий видеоотчёт о своём движении в мире джаваскрипта.

Будьте добры, оцените видос
Ставьте дизлайки, засирайте в комментариях, вот это вот всё❤️

[моё] Программирование IT Обучение Помощь YouTube Программист Профессия Javascript Саморазвитие Развитие Видео
22
4
Javascriptizer
2 года назад
Лига программистов

Фронт в 2022 // Изучаем программирование — Frontend⁠⁠

Ребят, прошу поддержки в начинании🙏


Многие хотят "вайти в айти", но не у всех получается. Я же решил наконец-то изменить свою жизнь и проверить: реально ли изучить javascript за 7 месяцев достаточно для трудоустройства?


Создал ютуб-канал, и теперь веду свой блог Джаваскриптизёр, где буду выкладывать видеоотчёт каждую неделю на протяжении 7 месяцев.


Монтаж видео одолел с горем пополам (сам, без мам и пап, без регистрации и смс). Будьте добры, оцените видос. Ведь как известно, социальное одобрение помогает Homo Sapiens поддерживать дисциплину.


Ставьте дизлайки, засирайте в комментариях, вот это вот всё❤
Критика и полезные ссылки приветствуются, конечно же😅

[моё] Помощь Программирование Обучение IT Javascript Профессия Видео YouTube
27
28
Web.Study
Web.Study
2 года назад

JavaScript еще не был таким понятным. Кирупа Чиннатхамби "JavaScript с нуля"⁠⁠

JavaScript еще не был таким понятным. Кирупа Чиннатхамби "JavaScript с нуля" Программирование, IT, Обучение, Книги, Javascript

Я недавно искала книгу о JS, где простым языком объясняются азы и скажу честно, лично мне было сложно найти такое.

И тут мне знакомый фронтендер посоветовал почитать Кирупа Чиннатхамби "JavaScript с нуля". В книге нет общих фраз, сложных терминов, а есть подробные, понятные (что самое главное) примеры.

Книга читается быстро благодаря легкой подаче информации и дойдя до последней главы, вы настолько прокачаете свои навыки, что сможете решить практически любую задачу


Особенно советую новичкам

Показать полностью 1
[моё] Программирование IT Обучение Книги Javascript
11
9
Web.Study
Web.Study
2 года назад
Web-технологии

React.js - одна из самых востребованных библиотек. Где её изучить, чтобы стать профессионалом?⁠⁠

React.js - одна из самых востребованных библиотек. Где её изучить, чтобы стать профессионалом? IT, Программирование, Обучение, Javascript, React

React никогда не был таким популярным. Согласно прошлогоднему опросу Stack Overflow , более 40 процентов профессиональных разработчиков утверждают, что в той или иной степени работали с React! Другими словами, если вы хотите заниматься фронтенд-разработкой, то время, потраченное на изучение работы с React, может оказаться выгодным вложением.


Для начинающих


Я всегда рекомендую людям начать с бесплатного руководства Кента Доддса по React для начинающих. Это бесплатный видеокурс, который проведет вас через 30 небольших и содержательных уроков, от использования обычного JavaScript для выполнения работы React до пошагового ознакомления с React и изучения всех самых основных частей, которые вам нужны, чтобы начать свое путешествие по React.


Цена: бесплатно. Ссылка на курс - egghead.io


Официальная документация React


При изучении новых фреймворков лучше всего начинать с официальной документации.

Новый сайт документации все еще находится в стадии бета-тестирования и добавляются новые разделы.


Цена: бесплатно. Ссылка - beta.reactjs.org.


Видео для изучения React


Если вы любите смотреть видео, я очень рекомендую это видео-введение, созданное Али Спиттел и Джейсоном Ленгсторфом. За полтора часа вы получите отличное введение в React и узнаете, какие преимущества вы получите от его использования по сравнению с другими фреймворками.


Цена: бесплатно. Смотрите на Learnwithjason.dev.


Учиться на практике


Пройдя некоторые из этих учебных пособий, руководств и курсов, вы получите достаточно опыта, чтобы уже начать искать проекты в качестве разработчика React.

И тогда вы по-настоящему поймёте все тонкости работы с React и станете еще более профессиональным разработчиком и сможете увеличивать цену за свои навыки.



Как вам? Уже знакомы с React?
Показать полностью
[моё] IT Программирование Обучение Javascript React
22
3
Clayter
Clayter
2 года назад
BitBurner
Серия BitBurner

Создание скриптов для BitBurner⁠⁠

Игра позволяет прописывать код во встроенном редакторе Nano, достаточно удобном в целом, но всё же интерфейс которого не самый привычный большинству, и совсем непривычен для новичков. Поэтому многие пользуются редактором VSCode с расширением Bitburner VSCode Integration. Считаю, что это гораздо удобнее, и рекомендую так же отстроить окружение. Для работы транспилятора необходимо также установить NodeJS помоложе (14+), а для Windows - Git, чтобы иметь unix-like терминал и можно было пользоваться всеми преимуществами контроля версий.

https://code.visualstudio.com/download - редактор

https://marketplace.visualstudio.com/items?itemName=bitburne... - расширение

https://nodejs.org/en/ - NodeJS

https://git-scm.com/downloads - git

Чтобы получить автокомплит, проще писать сразу на Typescript. Во-первых, язык помогает избежать многих ошибок, пусть и только в рантайме/на этапе транспиляции в JS. Во-вторых, организации покрупнее перешли или переходят на TS, поэтому для желающих во фронтенд практика TS лишней не будет.

На гитхабе есть множество готовых темплейтов, позволяющих сразу взять и писать скрипты с автодополнением и прочими плюшками. Я предпочитаю лишний раз самому разобраться, поэтому опишу базовую настройку окружения) Все подробности пишу под Windows, т.к. у линуксоидов всё же должны быть базовые навыки работы с терминалом. Будет полезно знакомящимся с экосистемой разработки под JS|TS, не только для BitBurner.

Итак, после установки всех вышеописанных программ мы должны настроить редактор и затем подготовить директорию для работы. Запускаем VS Code, и выбираем дефолтным окружением Git Bash по инструкции: https://code.visualstudio.com/docs/terminal/basics

Периодически настройка меняется, поэтому ссылка на оф. документацию. Я сижу на арче/убунте, поэтому могу ошибаться в нюансах работы на Windows, но, в целом, после выбора bash дефолтным терминалом проблем быть не должно.

Теперь при открытии терминала (ctrl+~ по умолчанию) у вас будет запускаться unix-like терминал. Теперь можно создавать проект :)

Создайте директорию, в которой будете хранить скрипты. Откройте её в VSCode и запустите терминал. Теперь инитим npm-проект командой npm init -y (флаг -y автоматом выберет дефолтные параметры), затем добавим необходимые пакеты:

npm install -D typescript @TypeScript-eslint/eslint-plugin @TypeScript-eslint/parser eslint eslint-config-airbnb-base eslint-plugin-import eslint-config-airbnb-typescript

Эта команда установит нужные библиотеки для разработки скриптов под игру + линтер (лучший друг любого кода).  Теперь нужно настроить линтер и Typescript. Для понимания настроек необходимо прочесть документацию:

https://eslint.org/docs/latest/user-guide/configuring/ - линтер

https://www.typescriptlang.org/docs/handbook/tsconfig-json.h... - typescript

Или просто создайте файлы через терминал:

code .eslintrc.js tsconfig.json

И вставьте готовые настройки из песочницы:

https://pastebin.com/1HiX5CrJ

https://pastebin.com/3zE82atx

Если у вас есть свой любимый конфиг линта, то добавьте в него правило 'import/prefer-default-export': 'off' , т.к. в большинстве случаев ESLint предлагает заменить конструкцию export fn main на export default, и подчёркивает весь код как неверный.

Теперь создадим папки для удобного размещения скриптов:

mkdir {src,build,types}

Эта команда создаст в текущей директории 3 папки. В одной мы будем хранить и прописывать TS файлы с исходным кодом (src от sources - исходники), в build будет готовый js - для синхронизации с игровым сервером, его руками менять не будем. И types - для хранения файла, описывающего API игры, тоже будем менять только при обновлениях игры (если будет меняться api, как в недавнем релизе 2.0.0+).

В tsconfig уже указали эти папки. Так же там есть настройка "paths" - она пригодится в будущем для импортов, т.к. игра не может в относительные пути.

Создание скриптов для BitBurner Javascript, Typescript, Скрипт, Туториал, Обучение, Web-программирование, Урок, Длиннопост

Теперь нам нужно добавить Type Definitions - собственно, описание апи игры, по которому мы получим автокомплит в редакторе, а при изучении его сможем многое полезное позже найти. Итак, как объявлено в tsconfig.json, мы должны создать файл NetscriptDefinitions.d.ts и положить его в папку types, а наполнить мы можем оригинальным описанием от разработчика:

https://github.com/danielyxie/bitburner/blob/dev/src/ScriptE...


ctrl+a, ctrl+c:

https://raw.githubusercontent.com/danielyxie/bitburner/dev/s...

Осталось дело за малым: запустить игру, старт API server и получить токен авторизации:

Создание скриптов для BitBurner Javascript, Typescript, Скрипт, Туториал, Обучение, Web-программирование, Урок, Длиннопост

Нужно включить верхние две опции и скопировать токен авторизации. Не закрывая игру, возвращаемся в VSCode, прожимаем палитру команд (ctrl+shift+p) и вводим BitBurner, выбираем Add Аuth Token и вставляем ранее скопированный токен из игры. И заодно включаем File Watcher, чтобы автоматизировать обновление скриптов в игре.

Создание скриптов для BitBurner Javascript, Typescript, Скрипт, Туториал, Обучение, Web-программирование, Урок, Длиннопост

Теперь нужно настроить пуш в игру файлов из папки build, а не всех папок. Для этого снова открываем настройки, как при выборе терминала, но теперь вводим в поиск scriptRoot, сразу находим нужную опцию и вводим ./build/

Создание скриптов для BitBurner Javascript, Typescript, Скрипт, Туториал, Обучение, Web-программирование, Урок, Длиннопост

Теперь при компиляции (таки скорее транспиляции) TS файлов в JS будет триггериться вотчер расширения, который отправит все файлы в игру и там мы можем сразу запускать их.

Осталось дело за малым: проверить, как оно работает. В папке src создаём файл с понятным названием и расширением .ts (например, hack.ts) и прописываем базовую структуру:

https://pastebin.com/aRjD3Xfr

Создание скриптов для BitBurner Javascript, Typescript, Скрипт, Туториал, Обучение, Web-программирование, Урок, Длиннопост

Нам нужно импортировать тайпинги и объявлять асинхронную функцию с именем main, которая принимает в себя как минимум один аргумент ns. Это требование апи игры. Исключение - вспомогательные именованные функции, которые вы будете импортировать как часть своего скрипта, там можно уже называть как угодно. Но если вы хотите запускать скрипт из терминала игры, то его исходник должен соответствовать такой структуре.

Последний этап - компиляция. Мы пишем скрипты в среде Node JS, поэтому нужно в главном файле любого проекта - package.json - указать скрипты для компиляции. Чтобы один раз запустить команду и дальше автоматом компилить TS файлы в JS, в поле scripts нужно добавить команду watch (или любую удобную, например, go) со значением tsc -w:

https://pastebin.com/1RPGXejc

Создание скриптов для BitBurner Javascript, Typescript, Скрипт, Туториал, Обучение, Web-программирование, Урок, Длиннопост

Теперь в терминале можно выполнить npm run watch и сосредоточиться только на написании кода. Вперёд, за взломом!))

Для желающих погрузиться:

1) попробуйте настроить tsconfig.json так, чтобы импортировать тайпинги NS можно было из '@ns'

подсказка: https://www.typescriptlang.org/docs/handbook/tsconfig-json.h... 

2) Создайте скрипты из туториала через данное окружение

Показать полностью 6
[моё] Javascript Typescript Скрипт Туториал Обучение Web-программирование Урок Длиннопост
0
prossec
prossec
2 года назад

Очередной программист. День #0⁠⁠

Дисклеймер.

Да, да, да бла-бла-бла, очередной программист, вас уже как говна за баней (кстати, вопрос к мирозданию, я никогда не видел за баней говна, кто-то видел?), стать программистом невозможно, конкуренция бешенная, никому вы не нужны, работу не найдешь, на джуна требований выше крыши, нужно образование и т.п и etc.


Привет Пикабу!

Этим постом я хочу обозначить начало своего длинного и сложного пути в мир IT. так будет проще мне, это будет дополнительная мотивация для меня, и в процессе обучения я буду писать о своих впечатлениях, выводах и разочарованиях, которые, скорее всего, станут полезны тем, кто решит идти по этому пути самостоятельно.

Коротко о себе: мне 29 лет, высшее гуманитарное образование, служу старшим бортпроводником в одной из крупнейших авиакомпаний страны, имею прекрасный английский, базовый французский и польский. В школе на информатике писал код на Pascal, а точнее рисовал на нём, было забавно. Плачу ипотека и имею жена :)


Зачем я хочу в айти?

Я в своей профессии 6 лет и дорос до максимума, уйти выше не принесет денег, морального удовлетворения, удовольствия, т.к. всё скатится в унылую рутину. Облетел почти весь мир, был очень много где, узнал много чудесных людей.

Я хочу стать модным словом, а именно "гражданином мира". Иметь профессию, которая востребована по всему земному шару, работать на фирму зарегистрированную в США/ЕС/РФ и т.д., а жить в это время во Вьетнаме или ещё хоть где, и да я прекрасно понимаю, что до такого уровня расти долго. Но главное, что эта перспектива ЕСТЬ. Возможность оперативных релокаций в реалиях сурово-быстро изменяющегося мира, это суперспособность!


Что я умею?

Ничего Читать, писать, говорить на английском языке, разбираюсь в железной части ПК. Умею быть сфокусированным, целеустремленным.


Чем я хочу заниматься?

А вот это вопрос номер один.

Я усердно гуглил, смотрел ютубы, читал статьи про ЯП, что это такое, что с ними делают, где они нужны, кто из них умер/умирает/умрет. И я смог успешно выбрать 3 языка программирования. разумеется, сразу 3 осилить с нуля невозможно, ненужно, не получится, поэтому я буду определяться. Как сказал один из крутых разработчиков со стажем >20 лет, берите язык, занимайтесь им 10-14 дней по 3-4 часа ежедневно и вывод напросится сам собой. Мне эта идея отсева очень понравилась, потому что:

а. Я смогу руками потрогать все языки, писать код.

б. Я буду опираться исключительно на своём мнении об этом ЯП.

в. Начиная с нуля, любые знания по ЯП, включая логику написания кода будут полезны для формирования общего кейса знаний.


Из чего выбираем то?


1. JS

Очередной программист. День #0 Обучение, Программирование, Учеба, Разное, Java, Javascript, C++, IT, HTML, CSS, Длиннопост

Что хочет нуб? Правильно, писать код, чтобы сразу были видны результаты того, что пишешь. Фронтенд был первой вещью, которая меня заинтересовала в IT. Это красиво, интересно, есть спрос. По информации с stack overflow JS ЯП №1 для релокации в другие страны. Конечно, понимаю о обязательном параллельном изучении HTML, CSS, React, TS и дохрена чего еще.

Как буду учить:

learn.javascript.ru, книга Кантора по JS (та же инфа с learn.javascript, но упорядоченная), книга Чиннатхамби, видеоуроки Богдана Стащюка с udemy.


2. Java

Очередной программист. День #0 Обучение, Программирование, Учеба, Разное, Java, Javascript, C++, IT, HTML, CSS, Длиннопост

Один из лидеров по вакансиям, зарплатам, востребованности. Финансовые системы, БД и многое другое написаны на Java. Замены ей, вероятно, никогда не будет ибо зачем трогать и менять то, что чудесно работает.

Как буду учить:

Java для начинающих: с нуля до сертификата Oracle курс Заура Трегулова с udemy, javarush.


3. C++

Очередной программист. День #0 Обучение, Программирование, Учеба, Разное, Java, Javascript, C++, IT, HTML, CSS, Длиннопост

Что? Вы сказали игры?

ябудуустанавливатьвсевсеигры

Последний избранник С++. Говорят крутой язык для задротов. Говорят игры пишут на С++, unreal engine с нами в команде. Язык интересный, сложный, мозги точно будут кипеть, геймдев это круто и хотелось бы там очутиться. хотя писать игры не так интересно, как в них играть. Ну и кроме геймдева С++ входит в топ востребованных языков программирования.

Как буду учить: #simplecode youtube, Доусон Изучаем С++ через программирование игр.


Finnally

Я поставил трекер себе на телефон и буду заниматься каждым из ЯП 40 часов (~4 часа в день ~10 дней на язык). Ровно за 40 часов я должен буду сделать вывод с чем я пойду дальше и буду интенсивно учить, а что отложу на потом/забуду нахрен как страшный сон.

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

P.S.

Да, программисты нахер никому не нужны, чё вы лезете все сюда. #мамаятожевайти

Идея и пост мои, учиться буду я, тег моё.

Показать полностью 3
[моё] Обучение Программирование Учеба Разное Java Javascript C++ IT HTML CSS Длиннопост
40
Партнёрский материал Реклама
specials
specials

Только каждый третий пикабушник доходит до конца⁠⁠

А сможете ли вы уложить теплый пол, как супермонтажник?

Проверить

Ремонт Теплый пол Текст
4
xfides
2 года назад
Лига программистов

Замыкание в JS по-человечески⁠⁠

----  ВВЕДЕНИЕ \ ВОДА  ----


Здравствуйте. Сижу в профильных чатах по фронтенду,  и  часто там возникает вопрос у новичков, как понять замыкание. Да, конечно, "малыши", бывает, не читают статьи, ленятся, где-то срезают углы. Но в подобных "уроках" часто используется профессиональный сленг, плюс нужна определенная база по программированию. В общем, информацию-ягодку проходится буквально выдирать из колючек-текстов.


Да, пусть тема избитая, изъезженная. Но, возможно, много кому данная статья поможет. В идеале, надо бы писать на технический ресурс, аля Habr или Medium. Но там надо вычитку делать, официальный деловой тон продумывать, оформление настраивать. А тут... Тут  язык можно попроще, картинку в Paint нарисовал, и все довольны. Однако ягодку я постараюсь сорвать и поднести поближе. Нет, жевать за вас не буду, Но вы хотя бы руки не поцарапаете.


----  ИСХОДНЫЙ \ БАЗОВЫЙ ПРИМЕР  ----


Итак, начнем. Не отходя от кассы, возьмем пример, который сегодня всплыл в чате.

Замыкание в JS по-человечески Javascript, IT, Программирование, Обучение, Длиннопост

Есть 2 функции: outer и inner. Названия довольно описательные. Даже на слух можно понять, где что лежит. После выполнения внешней outer функции её результат (внутренняя inner функция) записывается в переменную innerFrom. Затем полученный результат (внутренняя inner функция) вызывается, и финальный результат записывается в константу resFrom и выводится в консоль.


Вот и все замыкание. Что тут непонятного. Ха-ха. Типа пытался пошутить. Впрочем, ответы в чате в чем-то сильно сходились с моей шуткой. Но нет. Это только вводные данные текущей темы. А дальше...


Знаете, компьютер изобрели люди. Техника не возникла сама по себе. Значит и то, как устроено все это под капотом - чем-то сродни будет нам, нашим мыслям, нашему восприятию мира. Да, всегда, когда я объясняю что-то другим, я делаю упор на философскую составляющую. Код на экране без осознания того, что происходит, будет даваться на порядки сложнее. Так же и сейчас поступим.


----  ФИЛОСОФСКОЕ ПОНИМАНИЕ ВОПРОСА  ----


Вообразите себе, что вам надо испечь пирог. Но вы не знаете как. И вам мама дает рецепт из своей кулинарной книги. Или вы его распечатали из интернета. Что дальше происходит? Вам надо разобрать текст на бумаге. Потом осмыслить то, что вы прочитали. А потом вам надо действовать. Взяли продукты из холодильника и ... "нарисовали сову \ испекли пирог".


Нам сейчас пирог не так важен. Сконцентрируемся на подготовительных вещах.

- разобрать текст на бумаге \ просканировать его взглядом \ понять: где буквы, где предложения, где абзацы \ где начинается один пункт, и где заканчивается другой ...

- осмыслить прочитанный текст \ понять, что это рецепт пирога, а не варенья или самогона \ в уме прикинуть количество шагов для выполнения рецепта ...

- заготовить продукты, чтобы было из чего печь пирог \ подготовить стол для готовки ...


И только потом запустить фукнцию начать выполнять шаги по рецепту. Самое интересное, что почему-то мало кто делает акцент на этих подготовительных шагах. Типа это все само собой разумеется. В результате новичок приходит с рецептом к кухонному столу и ... (простите меня за это слово) тупит \ зависает. Ну а как: стол завален фигней, продуктов не хватает, в рецепте надо разбирать мелкий шрифт... Эх, печаль. Какой уж тут пирог. Легче это дело отложить, когда будут более лучшие условия.


----  МОСТИК МЕЖДУ ФИЛОСОФСКОЙ И ТЕХНИЧЕСКОЙ МЫСЛЬЮ  ----


Так вот, компьютер тоже делает все эти подготовительные шаги, что описаны выше. И без должного внимания к ним понять замыкание трудновато. Итак, что же делает интерпретатор JS, когда встречает ваш код.


Первое, что следует понять, ваш код для компьютера изначально - это просто поток букв. И этот поток букв кода надо разобрать \ просканировать \ определить, что среди этих букв есть слово function, круглые скобочки, фигурные скобочки и т.д.


Дальше распарсенный текст \ код компьютеру надо осмыслить. Забавно звучит. "Компьютер сидит вечером под окном и размышляет. А функции быть или не быть! А может сходить покушать, оперативку себе заполнить, добрее стану..." Осмысление компьютера выглядит как создание специального функционального объекта в оперативной памяти, куда он сложит все свои заметки по распарсенному ранее тексту. Вот здесь начинаются параметры функции. Вот здесь открывается тело функции. Вот здесь закрывается. А имя функции такое-то...


Для вас, новички, эта информация не видна. Она скрыта где-то в дебрях реализации движка JS. А снаружи у себя в коде вы оперируете только тем, что объявили фукнцию и вот - "её нет, она пропала" она есть. Хотите посмотреть, как выглядит этот функциональный объект официально с точки зрения спецификации Ecmascript? У меня даже скриншот с какого-то моего доклада валяется. Сейчас найду.

Замыкание в JS по-человечески Javascript, IT, Программирование, Обучение, Длиннопост

Зацените, как выглядит "осмысление" движком JS вашего кода фукнции, написанной в коде. Красота... Да, это пример другой функции, не из нашего исходного \ базового примера. Но сути дела это не меняет. Вы только всмотритесь. Интерпретатор и параметры определит, и строгий режим, и начало \ конец тела функции. Поймет даже, что функция написана в файле, а не модуле...


Подчеркиваю, это не запуск функции, это просто комп прочитал ваш код, и его осознал. Сохранил информацию о вашей функции куда-то к себе в память. Прямо как человек.


А дальше рецепт прочитан, осознан. Надо подготовить продукты... Функция, как рецепт - это последовательность действий, которую надо выполнить. В процессе выполнения функция будет оперировать данными \ информацией. То есть функция - это одно, а данные, с которыми функция работает - это совершенно другое. Данные, с которыми работает функция в процессе своего выполнения, лежат в отдельном месте оперативной памяти. Это место даже имеет специальное название - лексическое окружение (Lexical environment).


Почему так назвали - не знаю. Может удачнее было бы назвать local data. Типа местная \ локальная информация. Но я уже привык к Lexical environment (LE). Думаю, и вы запомните. Так что же там за данные валяются? Ответ - все, которые кажутся вам логичными:

- это и объявленные переменные внутри функции

- другие функции, объявленные внутри текущей

- и ваш нелюбимый this

- псевдомассив arguments

- параметры функций


То есть, представьте. Вы вызвали функцию. Пнули осмысленный ранее функциональный объект через специальный метод [[Call]]. Она пошла выполнять написанный вами алгоритм. Если в процессе выполнения ей понадобилась информация - она пошла в свой "чемоданчик LE", дернула тот кусок информации, который нужен - и продолжила свое выполнение. Все просто и логично.


----  БЛИЖЕ К JS \ СВОБОДНЫЕ ПЕРЕМЕННЫЕ  ----


Подытожим выше рассказанную информацию более строго. Объявление вашей функции в коде (декларация) - процесс, который приведет к следующему результату. Интерпретатор распарсит текст кода функции,  на результатах парсинга создат функциональный объект, созданный функциональный объект сохранит у себя в памяти в ожидании момента, когда его (функциональный объект) вызовут на исполнение. В процессе своего выполнения функция будет оперировать данными, которые хранятся в её личном, отдельном, лексическом окружении (LE).


Мы почти у цели. Сейчас вот-вот дойдем до замыкания. Но сначала надо задуматься вот над каким моментом. Думаю, уже многие из вас задали следующий правильный вопрос... Вот есть такое понятие как свободные переменные. Это та информация, которая есть \ написана в теле функции, но её нет в чемоданчике LE этой функции. Давайте даже скопирую рисунок сверху сюда, чтобы не листать туда-сюда обратно. Тебе и мне приятно. Загадка из детского журнала "Мурзилки".

Замыкание в JS по-человечески Javascript, IT, Программирование, Обучение, Длиннопост

Обратите внимание на функцию inner c 3 по 6 строки. Если эту функцию вызвать, то как будет выглядеть её "чемоданчик LE" ? Там будет валяться ... а вот не скажу... Проверяю, как вы читали выше материал (this, arguments, num2, res). А вот переменной num1 нет. Она не связана с текущей функцией inner. Переменная num1 свободна словно птица в небесах. И что делать по логике?


Варианты могут быть разные. И эти варианты даже реализованы в разных языках по-разному. Можете погуглить "Проблема фунарга". Но вам это не понравится. Там умные слова, которые мы не очень любим "переваривать". Хотя суть уже вам показана. Так как же поступает JS в том случае, когда идет обращение к переменной, которой нет в LE этой фукнции? Может, падает с ошибкой?


Нет, не падает с ошибкой. Идея проста. Если у ребенка нет своих денег, чтобы купить приставку, он идет и занимает их у мамы. Да, если нет своих данных, мы можем "порыться в чужом чемоданчике LE". Гениально, не правда ли? Как только выбрать среди чужих "чемоданчиков LE" тот, в котором будем искать недостающую информацию?


----  SCOPE CHAIN  КАК РЕШЕНИЕ ПРОБЛЕМЫ СВОБОДНЫХ ПЕРЕМЕННЫХ  ----


Заметили? Что заметили? Как что, а на рисунке видели? Слово новое: scope, область видимости. Знакомый термин, да. Все понимают, однако сформулировать определение для новичка иногда бывает проблемой. Давайте уточним понятия, чтобы мы друг друга хотя бы понимали. А над проблемой отцов и детей поразмышляем позже.


Scope или область видимости - набор информации, с которой работает выполняемый код в текущий момент. Да, вы правы, где-то мы уже об этом говорили. Чемоданчик "LE". Давайте пока договоримся, что будем считать это одним и тем же. За одним важным различием. Scope \ область видимости - философское понятие (информация, с которой работает функция), а техническое выражение этого scope - объект LexicalEnvironment, создаваемый во время исполнения функции под капотом движка JS


Итак, мы хотим, чтобы переменная num1 была в scope \ области видимости функции inner. Однако в чемоданчике LE функции inner этой переменной нет. Мы уже определили вариант решения этой проблемы:  пойти и порыться в чужой области видимости. Или технически перейти в другой объект "чемоданчика LE", не связанный с нашей функцией inner. Переходя по чужим LE, вы фактически ходите по цепи кругом из этих LE. Да! Если не найдем что-то во втором чемоданчике LE, то почему бы не сходить в третий, четвертый...


Набор связанных между собой (специальной ссылкой) лексических окружений LE,  расширяющих область видимости конкретной функции - scope chain. Ух, сложное определение. Каждое слово на вес золота, их надо прям прочувствовать. Хотя идея проста. Рыться в чужих чемоданчиках LE, пока не найдем нужную нам информацию для выполнения нужной нам функции.


----  ЗАМЫКАНИЕ ИЛИ "Как только выбрать среди чужих "чемоданчиков LE" тот, в котором будем искать недостающую информацию?"  ----


Да, мы добрались до заветной главы. Замыкание – механизм, который связывает "чемоданчики LE". Сейчас мы разберем, как работает этот механизм. Но прежде еще немного мыслей по терминологии. Выше написанное определение, которое я еще чуть расширю позже, оно было сформулировано мною. Вы вольны не соглашаться или выразить свое определение. Тут идет игра терминов на пересечении лингвистики и разделов науки, так скажем.

Часто вы можете видеть более упрощенное \ усложненное \ другое определение. Например, возьмем определение с MDN. Замыкание - это комбинация функции и лексического окружения, в котором эта функция была определена. Однако это определение легко спутать, а впоследствии подменить тем же определением scope chain.


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


---- МЕХАНИЗМ ЗАМЫКАНИЯ В JS ----


Скопирую, пожалуй, я рисунок снова.

Замыкание в JS по-человечески Javascript, IT, Программирование, Обучение, Длиннопост

Вот мы все рассматривали функции inner и её проблемы. Теперь обратим внимание на функцию outer на первой строчке. Когда она будет выполняться, что будет лежать в её LE? Да, знаю, вы уже научены. Меня интересует следующее. В "чемоданчике LE" функции outer будет лежать функциональный объект функции inner. Да, функция inner была объявлена в области видимости функции outer, а значит, эта информация будет содержаться в лексическом окружении outer.


Ну раз inner лежит внутри "чемоданчика LE" outer, догадайтесь с трех раз, куда замкнет "чемоданчик LE" функции inner при её вызове? Где будем искать недостающую информацию о переменной num1 при вызове функции inner? Правильно, замыкание свяжет лексическое окружение функции inner c лексическим окружением функции outer. Благодаря чему переменная num1 при выполнении функции inner будет найдена в лексическом окружении функции outer.


Попробую сформулировать по-человечески. Если у ребенка не хватает денег на приставку, будем искать деньги в кошельке у того, где этот ребенок родился. То есть у мамы. Если у мамы денег нет, то будем искать деньги в кошельке... у папы. А вот и нет. Я вас подловил. Ищем недостающее у того, где родились. То есть, если у мамы нет денег ребенку на приставку, пойдем поищем денег у бабушки. Она добрая, любит внука =)


И еще раз, по третьему кругу. Механизм замыкания срабатывает при рождении \ декларации функции. Так как новосозданная функция родилась в родительском лексическом окружении внешней функции, то при будущем вызове новосозданной функции её уже собственное, лексическое окружение будет гарантированно привязано \ замкнуто к родительскому LE внешней функции.


---- МЕХАНИЗМ ЗАМЫКАНИЯ В JS ДЛЯ УПОРНЫХ ----


Взглянем еще раз на рисунок...

Замыкание в JS по-человечески Javascript, IT, Программирование, Обучение, Длиннопост

Посмотрите на созданный функциональный объект Sum. (Осознание текста вашего кода в память компьютера. Помните?) Обратите внимание на одно свойство [[Environment]]. Это свойство заполняется при создании \ декларации функции Sum текущим LexicalEnvironment выполняемого кода. На рисунке это будет LexicalEnvironment всего скрипта ./index.js. (Глобальное лексическое окружение. Там еще глобальный объект window лежит.) То есть, лексическое окружение функции Sum будет замкнуто на глобальное окружение скрипта, потому что эта функция Sum объявлена \ задекларирована в теле глобального скрипта ./index.js.


А вот теперь функцию Sum вызвали. И она для своего выполнения (execution context) готовит свой Sum LE. Правый нижний угол рисунка.

Замыкание в JS по-человечески Javascript, IT, Программирование, Обучение, Длиннопост

То есть, во время вызова функции Sum будет создано её личное лексическое окружение Sum LE.


И ссылка для замыкания Scope будет взята из ранее записанного в функцию Sum свойства [[Environment]].Не путайте ссылку c именем Scope с термином scope как область видимости.


Значением свойства [[Environment]] функционального объекта Sum будет являться ссылка на  внешнее глобальное лексическое окружение  Global LE скрипта index.js.


Потому что при выполнении кода глобального скрипта index.js было встречено и обработано  текстовое объявление \ декларация функции Sum.


Таким образом, после того, как ссылка Scope лексического окружения Sum была скопирована с ссылки [[Environment]] функционального объекта Sum, область видимости функции Sum была расширена глобальной областью видимостью скрипта, образовав scope chain.


Замыкание – механизм, который при вызове функции устанавливает связь её собственного лексического окружения с внешним лексическим окружением, где эта функция была создана.


Да, вы сделали это. Хотя бы прочитали. Надеюсь, даже поняли.


---- ПОДВЕДЕНИЕ ИТОГОВ. НАКАЗАНИЕ ВИНОВНЫХ. НАГРАЖДЕНИЕ НЕПРИЧАСТНЫХ ----


Вернемся к исходному рисунку. Не помню, какой раз его уже копирую...

Замыкание в JS по-человечески Javascript, IT, Программирование, Обучение, Длиннопост

Вопросы для самопроверки:

1. назовите данные лексического окружения функции inner

2. назовите данные лексического окружения функции outer

3. назовите данные глобального лексического окружения

4. скажите, куда замкнуто лексическое окружение функции inner

5. скажите, куда замкнуто лексическое окружение функции outer

6. скажите, куда замкнуто лексическое окружение функции inner (тут подскажу. Оно равно null)

7. почему функция inner не упадет, если в её лексическом окружении нет переменной num1

8. в какой момент исполнения кода создается необходимая информация для замыкания

9.  есть ли в коде еще свободные переменные, кроме переменной num1

10. дайте следующие определения:

---- лексическое окружение \ lexical environment

---- область видимости \ scope

---- цепочка областей видимостей \ scope chain

---- свободная переменная

---- замыкание


Да... смотрю я на это все....и понимаю, что, наверное, я вас обманул, пообещав рассказать по-человечески. Но не сердитесь. Улыбайтесь, господа. Улыбайтесь! 

Показать полностью 7
[моё] Javascript IT Программирование Обучение Длиннопост
23
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии