diff --git a/01-intro/css/user.css b/01-intro/css/user.css index c56b761..d6d5742 100644 --- a/01-intro/css/user.css +++ b/01-intro/css/user.css @@ -34,3 +34,7 @@ section .strike { text-decoration: line-through; color: #888; } + +.reveal { + background: #000; +} diff --git a/01-intro/index.html b/01-intro/index.html index 04a3432..3e46bfa 100644 --- a/01-intro/index.html +++ b/01-intro/index.html @@ -23,7 +23,7 @@

JavaScript

-

Введение. Основы языка. github

+

Введение. Основы языка.

Жигалов Сергей

@@ -99,6 +99,28 @@

JSON

Дуглас Крокфорд, 2001

+
+

XML

+

+
+
+ Works
+ true
+ 3
+ 
+ 
+ Лёша
+ cappuccino
+ 
+ 
+ Лиза
+ tea
+ 
+ 
+
+ 
+
+

JSON


@@ -120,27 +142,27 @@ 

JSON

-
-

XML

-

-
-
- Works
- true
- 3
- 
- 
- Лёша
- cappuccino
- 
- 
- Лиза
- tea
- 
- 
-
+ 
+
 
@@ -167,7 +189,7 @@

NodeJS

npm
-
+
@@ -221,8 +243,7 @@

JavaScript

-

Основы языка

-

Типы данных

+

Типы данных

@@ -231,9 +252,9 @@

Типы данных

  • числа
  • строки
  • булевые величины
  • -
  • объекты* и массивы*
  • -
  • функции*
  • неопределённые величины
  • +
  • объекты и массивы
  • +
  • функции
  • @@ -260,7 +281,6 @@

    Числовой. Системы счисления

    Числовой. Экспонента

    -

    64 бит

    
     2^64 = 18446744073709552000
    @@ -351,8 +371,39 @@ 

    typeof

    -

    Основы языка

    -

    Переменные

    +

    Преобразование к числу

    +
    + +
    +
    
    +parseInt(string, radix);
    + 
    + +
    
    +parseInt('17', 10); // 17
    +parseInt('123'); // 123
    +parseInt('11', 2); // 3
    +parseInt('a1', 10); // NaN
    +parseInt('2b', 10); // 2
    + 
    +
    + +
    +
    
    +parseFloat(строка)
    + 
    + +
    
    +parseFloat('3.14'); // 3.14
    +parseFloat('314e-2');// 3.14
    +parseFloat('a1'); // NaN
    + 
    +
    +
    + +
    +
    +

    Переменные

    @@ -361,12 +412,21 @@

    Переменные

    var studentsCount; studentsCount = 98;
    +
    
    +studentsCount; // 98;
    + 
    +

    + +
    +

    Переменные

    + +
    
     var studentsCount = 98;
     
    
    -var studentsCount = 98,
    -language = 'JavaScript';
    +var studentsCount,
    + language = 'JavaScript';
     
    @@ -390,6 +450,7 @@

    Именование переменных

    Именование переменных

    +
    
     // Переменная
     var currentTime;
    @@ -413,17 +474,60 @@ 

    Зарезервированные слова

    delete in instanceof typeof var void
    - https://clck.ru/9auhk +
    
    +class enum extends super
    +const export import
    + 
    +
    +

    Именование переменных

    + +
    
    +spisokDruzey; // ❌
    +tsena; // ❌
    + 
    + +
    
    +friends; // ✅
    +price; // ✅
    + 
    +
    -

    Зарезервированные слова

    -
    
    -class enum extends super
    -const export import
    + 

    Именование переменных

    + +
    
    +h, w; // ❌
    +friendsListWithNameAndAge; // ❌
    + 
    + +
    
    +height, width; // ✅
    +myFriends; // ✅
    + 
    +
    + +
    +

    Именование переменных

    + +
    
    +my_friends; // ❌
    + 
    + +
    
    +myFriends; // ✅
    + 
    +
    + +
    +

    Именование переменных

    + +
    
    +isCorrect = true;
    +totalCount = 47;
    +friends = [];
     
    - https://clck.ru/9auhk
    @@ -436,7 +540,7 @@

    Комментарии

    
     /* а это длинный комментарий
    -написаный в несколько строк */
    +написанный в несколько строк */
     
    @@ -466,9 +570,9 @@

    Комментарии

    +
    -

    Основы языка

    -

    Операторы

    +

    Операторы

    @@ -477,6 +581,7 @@

    Унарные

     ++ (инкремент)
     -- (декремент)
    ++ (унарный плюс)
     - (унарный минус)
     ! (логическое НЕ)
     
    @@ -555,26 +660,27 @@

    Присваиваивание

    *=, /=, +=, -=, &=, ^=, |= 
    (присваивание с операцией)
    
     var a = 1;
    -a += 1;
     a = a + 1;
    +a += 1;
     
    -

    Условные операторы

    -
    
    + 
    +

    Условные операторы

    +
    
     if (language === 'JavaScript') {
     likes = likes + 1;
     } else {
     likes = likes - 1;
     }
    - 
    -
    
    + 
    +
    
     likes = language === 'JavaScript' ?
     likes + 1 :
     likes - 1;
    - 
    -
    +
    +

    Условные операторы

    @@ -589,10 +695,11 @@

    Условные операторы

    default: likes--; } -
    + +
    -
    +
    -

    ;

    -
    
    + 
    +

    Точка с запятой

    +
    +
    +

    Точка с запятой

    +
    
     function getTrue() {
     return true;
     }
     
     getTrue(); // true
    - 
    -
    +
    +
    -
    -

    ;

    -
    
    + 
    +

    Точка с запятой

    +
    
     function getTrue() {
     return
     true;
     }
     
     getTrue(); // undefined
    - 
    +
    +
    -

    Основы языка

    -

    Строгий режим

    -
    +
    +

    Строгий режим

    +
    -
    -

    Строгий режим

    -
    
    + 
    +

    Строгий режим

    +
    
     'use strict';
     
     // этот код будет работать
     // по современному стандарту ES5
    - 
    +
    + +

    Спецификация

    +
    + +
    +
    
    +text = 'hello';
    +
    +text; // 'hello'
    + 
    + +
    
    +'use strict';
     
    - 

    Спецификация

    +text = 'hello'; // ReferenceError: + // text is not defined +
    +
    @@ -684,7 +812,7 @@

    NodeJS

    -
    + -
    + +
    - +
    Подтверждение почты
    @@ -1108,7 +1236,7 @@
    http://bit.ly/urfu2016reg

    Домашнее задание

    XXL

    -
    +
    -->
    @@ -1121,8 +1249,8 @@

    XXL

    // https://github.com/hakimel/reveal.js#configuration Reveal.initialize({ controls: false, - progress: true, - slideNumber: true, + progress: false, + slideNumber: false, history: true, center: true, hideAddressBar: true, @@ -1140,23 +1268,23 @@

    XXL

    hljs.initHighlightingOnLoad(); } }, - { - src: '../plugin/menu/menu.js' - } + // { + // src: '../plugin/menu/menu.js' + // } ], - menu: { - side: 'left', - numbers: true, - titleSelector: 'h1, h2, h3, h4, h5, h6', - hideMissingTitles: true, - markers: true, - custom: false, - themes: false, - transitions: false, - openButton: true, - openSlideNumber: false, - keyboard: true - }, + // menu: { + // side: 'left', + // numbers: true, + // titleSelector: 'h1, h2, h3, h4, h5, h6', + // hideMissingTitles: true, + // markers: true, + // custom: false, + // themes: false, + // transitions: false, + // openButton: true, + // openSlideNumber: false, + // keyboard: true + // }, }); diff --git a/04-functions/css/user.css b/04-functions/css/user.css index 0a81ba7..aee42be 100644 --- a/04-functions/css/user.css +++ b/04-functions/css/user.css @@ -59,3 +59,15 @@ font-style: italic; font-family: sans-serif; } +.reveal { + background: #000; +} + +body { + /*transform: scaleY(-1) !important;*/ +} + +.reveal .shadow, +.reveal .shadow h3 { + text-shadow: 0 0 5px rgba(0, 0, 0, 0.5) !important; +} diff --git a/04-functions/index.html b/04-functions/index.html index e820cc4..b534311 100644 --- a/04-functions/index.html +++ b/04-functions/index.html @@ -27,11 +27,30 @@

    Аргументы. Область видимости. Всплытие. З

    Жигалов Сергей

    + + + +

    Функции

    +
      -
    • Не повторять код (DRY)
    • Объединить группу действий
    • +
    • Не повторять код (DRY)
    • Рекурсивный вызов
    • Создать область видимости*
    @@ -107,7 +126,7 @@

    Аргументы. Значения по умол

    Аргументы. Значения по умолчанию

    
    -function getCartSum(price, count) {
    +function getCost(price, count) {
     count = count || 1;
     
     return price * count;
    @@ -115,19 +134,19 @@ 

    Аргументы. Значения по умол

    
    -getCartSum(27.70, 10); // 🍏 277₽
    -getCartSum(49.90); // 🍅 49.9₽
    +getCost(27.70, 10); // 🍏 277₽
    +getCost(49.90); // 🍅 49.9₽
     
    
    -getCartSum(99999, 0); // 🚀 99999₽ ???
    +getCost(9999, 0); // 🚀 9999 ???
     

    Аргументы. Значения по умолчанию

    
    -function getCartSum(price, count) {
    +function getCost(price, count) {
     if (count === undefined) {
     count = 1;
     }
    @@ -137,9 +156,9 @@ 

    Аргументы. Значения по умол

    
    -getCartSum(27.70, 10); // 🍏 277₽
    -getCartSum(49.90); // 🍅 49.9₽
    -getCartSum(99999, 0); // 🚀 0₽
    +getCost(27.70, 10); // 🍏 277₽
    +getCost(49.90); // 🍅 49.9₽
    +getCost(99999, 0); // 🚀 0₽
     

    @@ -188,13 +207,13 @@

    arguments

    [引用] Объект arguments - это подобный массиву объект, который содержит аргументы, переданные в функцию. - Arguments object. MDN + Arguments object - JavaScript | MDN
    
     function example() {
    - arguments[1]; // 12
    + arguments[1]; // 12
     arguments.length; // 2
     }
     
    @@ -273,8 +292,8 @@ 

    Методы функции. Call

    -
    -

    Объявление функции

    +
    +

    Объявление функции

    Васнецов. "Витязь на распутье"
    @@ -288,7 +307,7 @@

    Объявление функции

    }
    -
    
    + 
    
     // function expression
     var add = function (a, b) {
     return a + b;
    @@ -392,7 +411,7 @@ 

    Создание области видимости

    } text; // ReferenceError: - // text is not defined
    + // text is not defined
    
     ┌{ greet }
     ├─┬{ text }
    @@ -400,6 +419,7 @@ 

    Создание области видимости

    │ │ │ │ +│ │
    @@ -407,6 +427,7 @@

    Создание области видимости

    ❌ Нет блочной области видимости*

    +

    * Standard ECMA-262 5.1 Edition

    
    @@ -490,9 +511,10 @@ 

    Затенение

    -
    -

    Всплытие

    - Репин. "Бурлаки на Волге" + +
    +

    Всплытие

    +
    @@ -510,7 +532,7 @@

    Выполнение кода

    -
    +

    Всплытие функций

    @@ -529,7 +551,7 @@

    Всплытие функций

    -
    +

    Всплытие функций

    @@ -608,7 +630,7 @@

    Всплытие переменных

    -
    +

    Всплытие переменных

    @@ -630,7 +652,7 @@

    Всплытие переменных

    -
    + + +
    +

    Всплытие переменных

    + +
    +
    
    +function greet() {
    + var text = 'Привет';
    +}
    +
    +
    +
    { greet: function }
    +
    +
    +
    +
    +
    +
    + +
    +

    Всплытие переменных

    + +
    +
    
    +function greet() {
    + var text = 'Привет';
    +}
    +
    +
    +
    
    +{ greet: function, text: undefined }
    +
    +
    +
    +
    +
    + +
    +

    Всплытие переменных

    + +
    +
    
    +function greet() {
    + var text = 'Привет';
    +}
    +
    +
    +
    
    +
    +{ greet: function, text: 'Привет' }
    +
    +
    +
    +
    + +
    +

    Всплытие переменных

    + +
    +
    
    +function greet() {
    + var text = 'Привет';
    +}
    +
    +
    +
    
    +
    +
    +
    +{ greet: function }
    +
    -
    +

    Замыкание

    Микеланджело. "Сотворение Адама"
    @@ -952,7 +1046,7 @@

    IIFE

    return date.toGMTString() } - return function(date) { + return function getDateString(date) { date = date || new Date(); return format(date); } @@ -1003,8 +1097,8 @@

    Почитать

    // https://github.com/hakimel/reveal.js#configuration Reveal.initialize({ controls: false, - progress: true, - slideNumber: true, + progress: false, + slideNumber: false, history: true, center: true, hideAddressBar: true, @@ -1022,23 +1116,23 @@

    Почитать

    hljs.initHighlightingOnLoad(); } }, - { - src: '../plugin/menu/menu.js' - } + // { + // src: '../plugin/menu/menu.js' + // } ], - menu: { - side: 'left', - numbers: true, - titleSelector: 'h1, h2, h3, h4, h5, h6', - hideMissingTitles: true, - markers: true, - custom: false, - themes: false, - transitions: false, - openButton: true, - openSlideNumber: false, - keyboard: true - }, + // menu: { + // side: 'left', + // numbers: true, + // titleSelector: 'h1, h2, h3, h4, h5, h6', + // hideMissingTitles: true, + // markers: true, + // custom: false, + // themes: false, + // transitions: false, + // openButton: true, + // openSlideNumber: false, + // keyboard: true + // }, }); diff --git a/05-this/css/user.css b/05-this/css/user.css index 6b4c090..8c527d3 100644 --- a/05-this/css/user.css +++ b/05-this/css/user.css @@ -49,3 +49,16 @@ .reveal ul.no-bullet li { list-style-type: none; } + +.reveal { + background: #000 !important; +} + +body { + /*transform: scaleX(-1) !important;*/ +} + +.reveal .shadow, +.reveal .shadow h3 { + text-shadow: 0 0 5px rgba(0, 0, 0, 0.5) !important; +} diff --git a/05-this/index.html b/05-this/index.html index f814164..3567fc4 100644 --- a/05-this/index.html +++ b/05-this/index.html @@ -23,11 +23,11 @@

    this

    -

    Контекст исполнения

    -

    Жигалов Сергей

    + +
    -
    +
    -
    +

    this C#

    @@ -190,7 +190,7 @@

    this Java

    public static void main(String []args){ User mike = new User(); - mike.showAge(); + mike.showAge(); // 24 }
    @@ -200,8 +200,8 @@

    Свойства this

    • ключевое слово
    • -
    • указывает на текущий объект
    • нельзя перезаписать
    • +
    • указывает на текущий объект
    @@ -226,12 +226,12 @@

    this JavaScript

    -

    Свойства this

    +

    Свойства this в JavaScript

    • ключевое слово
    • -
    • указывает на текущий объект
    • нельзя перезаписать
    • +
    • указывает на текущий объект
    • можно использовать за пределом объекта*
    @@ -337,10 +337,6 @@

    I. Тип участка кода. Глобаль
    
     window.innerWidth; // 1280
     
    - -
    
    -innerWidth; // 1280
    - 

    @@ -353,10 +349,6 @@

    I. Тип участка кода. Глобаль
    
     global.process.version; // "v7.0.0"
     
    - -
    
    -process.version; // "v7.0.0"
    - 

    @@ -414,6 +406,10 @@

    I. Тип участка кода. Node.js мод

    +
    +

    II. Как попали на участок кода

    +
    +

    II. Как попали на участок кода. Простой вызов

    @@ -654,7 +650,7 @@

    II. Как попали на участок кода. function func() { - var args = Array.prototype.slice.call(arguments); + var args = [].slice.call(arguments); }

    @@ -808,7 +804,7 @@

    🍅 Результат

    II. Как попали на участок кода. Callback

    -
    
    + 
    
     var person = {
     name: 'Sergey',
     items: ['keys', 'phone', 'banana'],
    @@ -824,7 +820,7 @@ 

    II. Как попали на участок кода.

    -
    
    + 
    
     ┌{ person }
     │
     │
    @@ -1022,7 +1018,7 @@ 

    🍏 Результат

    myBind

    -
    
    + 
    
     Function.prototype.myBind = function(_this) {
     var fn = this;
     var args = [].slice.call(arguments, 1);
    @@ -1060,7 +1056,7 @@ 

    Частичное применение

    II. Как попали на участок кода. Конструктор

    -
    function User () {
    + 
    function User () {
     return {
     age: 24,
     
    @@ -1072,9 +1068,8 @@ 

    II. Как попали на участок кода.

    -
    
    + 
    
     
     
     
    @@ -1085,7 +1080,6 @@ 

    II. Как попали на участок кода.

    @@ -1094,7 +1088,7 @@

    II. Как попали на участок кода.II. Как попали на участок кода. Конструктор

    -
    function User () {
    + 
    function User () {
     return {
     age: 24,
     
    @@ -1107,7 +1101,7 @@ 

    II. Как попали на участок кода.

    -
    
    + 
    
     
     
     
    @@ -1118,7 +1112,6 @@ 

    II. Как попали на участок кода.

    @@ -1126,10 +1119,10 @@

    II. Как попали на участок кода.
    -

    Строгий режим

    +

    III. Режим работы интерпретатора

    -
    +

    III. Режим работы интерпретатора. Режим совместимости

    @@ -1368,8 +1361,8 @@

    Сегодня

    // https://github.com/hakimel/reveal.js#configuration Reveal.initialize({ controls: false, - progress: true, - slideNumber: true, + progress: false, + slideNumber: false, history: true, center: true, hideAddressBar: true, @@ -1387,23 +1380,23 @@

    Сегодня

    hljs.initHighlightingOnLoad(); } }, - { - src: '../plugin/menu/menu.js' - } + // { + // src: '../plugin/menu/menu.js' + // } ], - menu: { - side: 'left', - numbers: true, - titleSelector: 'h1, h2, h3, h4, h5, h6', - hideMissingTitles: true, - markers: true, - custom: false, - themes: false, - transitions: false, - openButton: true, - openSlideNumber: false, - keyboard: true - }, + // menu: { + // side: 'left', + // numbers: true, + // titleSelector: 'h1, h2, h3, h4, h5, h6', + // hideMissingTitles: true, + // markers: true, + // custom: false, + // themes: false, + // transitions: false, + // openButton: true, + // openSlideNumber: false, + // keyboard: true + // }, }); diff --git a/05-this/text.txt b/05-this/text.txt new file mode 100644 index 0000000..5534b60 --- /dev/null +++ b/05-this/text.txt @@ -0,0 +1,64 @@ +1. +Привет. На этой неделе я расскажу вам о ключевом слове this в языке JavaScript + +2.1. Возможно вы уже сталкивались с ним в других языках программирования. +Например в си шарп мы можем использовать this в следующем примере. +Объявим класс User который описывает некоторого пользователя. +Он состоит из приватного поля age в котором записан возраст и публичного метода +ShowAge поторый выводит на консоль возраст. Для того чтобы обратиться к полю класса +из его метода мы используем ключевое слово this после которого указываем название поля. +Таким образом создав экземпляр класса и позвав метод ShowAge мы увидим на консоли +значение поля age + +2.2 Аналогичный пример мы можем написать на языке Java +Класс User по прежнему состоит из публичного метода showAge в котором выводит +на консоль значение приватного поля age, к которому обращаемся через ключевое слово this. +После создания инстанса класса и вызова метода мы также как и в предыдущем примере + +2.3. Во всех этих примерах у this есть общие свойства. +Это ключевое слово языка и мы не можем его перезаписать. Но самое главное, +мы можем его использовать только в пределах объекта. За его пределами использование +this не имеет смысла. + +2.4. Похожий пример на JavaScript мы можем написать следующим образом: +Объявим функцию User которая возвращает объект, состоящий из двух полей: age и showAge +Поле showAge обращяется к полю age через ключевое слово this. Создавая инстанс пользователя +и вызывая метод showAge мы увидим на консоли значение которое сохранено в поле age + + +... + +5.1. Как мы уже поняли в предыдущем видео значение this определяется в момент +выполнения кода и зависит от нескольких факторов. В этом видео мы рассмотрим +чему равен this на различных участках кода. + +5.2. Если мы обратимся к полю innerWith находясь в глобальном коде в браузере, то получим +значение 1280 равное ширине окна. Такое же значение мы получаем, когда обращаемся +к полю innerWith объекта window. + +5.3. При выполнении кода на nodejs обращаясь к свойству process.version мы +получим строку содержащую версию нашего интерпретатора. Аналогичное значение +мы получим если обратимся к process.version у глобального объекта. + +5.4. Вы наверняка не раз уже использовали console.log для вывода значений на консоль. +Но мало кто задумывался что свойство console мы вызываем у глобального объекта + +... + +7.1. Следующий фактор, который влияет на значение this это способ, +которым мы попали на тот или иной участок кода. + +7.2. Опишем функцию getSelf которая возвращает текущее значение this. +При вызове такой функции возвращаемое значение будет равно текущему значению this. +Таким образом если мы позовем getSelf в основном коде, то она вернет глобальный объект +global или window в зависимости от того в каком окружении мы работаем + +7.3. Если мы вызываем эту функцию в рамках модуля, то она вернет объект, +который модуль экспортирует. В нашем случае это объект, который содержит поле days +со значением 366. + +8.1 Кроме простого вызова, мы можем вызвать функцию как метод объекта. Давайте +рассмотрим такой пример: объявим объект `block` со свойством innerHeight и методом +getHeight которое возвращает значение поля innerHeight в объекте this. +Важно понимать, что this определяется не в момент описания функции, а в момент +её выполнения diff --git a/08-async/css/user.css b/08-async/css/user.css index 05a25e5..67ee317 100644 --- a/08-async/css/user.css +++ b/08-async/css/user.css @@ -99,3 +99,20 @@ .reveal .red { color: red; } + +.reveal { + background: #000; +} + +body { + /*transform: scaleX(-1) !important;*/ +} + +.reveal .shadow, +.reveal .shadow h3 { + text-shadow: 0 0 5px rgba(0, 0, 0, 0.5) !important; +} + +.reveal .w100 { + width: 100%; +} diff --git a/08-async/index.html b/08-async/index.html index d070119..731fef3 100644 --- a/08-async/index.html +++ b/08-async/index.html @@ -24,7 +24,7 @@

    Асинхронный код

    Очередь событий. Таймеры. Callback. Promise

    -

    Жигалов Сергей

    +
    @@ -108,7 +108,7 @@

    Стек вызовов

    prepareCoffee(); } -
    +toCheerUp();
    
     
     
    @@ -378,7 +378,7 @@ 

    Очередь событий

    anonymous

    -
    
    + 
    
     
    @@ -404,7 +404,7 @@

    Очередь событий

    toCheerUp anonymous
    -
    
    + 
    
     
    @@ -431,7 +431,7 @@

    Очередь событий

    toCheerUp anonymous
    -
    
    + 
    
     
    @@ -458,7 +458,7 @@

    Очередь событий

    toCheerUp anonymous
    -
    
    + 
    
     
    @@ -485,7 +485,7 @@

    Очередь событий

    toCheerUp anonymous
    -
    
    + 
    
     
    @@ -512,7 +512,7 @@

    Очередь событий

    toCheerUp anonymous
    -
    
    + 
    
     
    @@ -539,7 +539,7 @@

    Очередь событий

    anonymous
    -
    
    + 
    
     
    @@ -566,13 +566,13 @@

    Очередь событий

    -
    
    + 
    
     
     
     
     
    -
    +

    Системный таймер

    Сальвадор Дали «Постоянство времени»
    @@ -823,7 +823,7 @@

    setInterval

    toStove(); setInterval(toStir, 1000);
    -
    fromStove
    +
    toStir
    'Поставить на плиту'
     'Помешивать'
     
    @@ -863,7 +863,7 @@ 

    setInterval

    toStove(); setInterval(toStir, 1000);
    -
    fromStove
    +
    toStir
    'Поставить на плиту'
     'Помешивать'
     'Помешивать'
    @@ -903,7 +903,7 @@ 

    setInterval

    toStove(); setInterval(toStir, 1000);
    -
    fromStove
    +
    toStir
    'Поставить на плиту'
     'Помешивать'
     'Помешивать'
    @@ -932,7 +932,7 @@ 

    setInterval

    
    -var id = setInterval(fromStove, 1000);
    +var id = setInterval(toStir, 1000);
     
    
    @@ -950,7 +950,7 @@ 

    setInterval

    console.log('Поставить на плиту'); setInterval(toStir, 1000); -executionThreeSeconrs(); +runsThreeSeconds();
    @@ -962,7 +962,7 @@

    setInterval

    console.log('Поставить на плиту'); setInterval(toStir, 1000); -executionThreeSeconrs(); +runsThreeSeconds();
    anonymous
    
    @@ -979,7 +979,7 @@ 

    setInterval

    console.log('Поставить на плиту'); setInterval(toStir, 1000); -executionThreeSeconrs(); +runsThreeSeconds();
    
     
    'Поставить на плиту'
    @@ -997,7 +997,7 @@ 

    setInterval

    console.log('Поставить на плиту'); setInterval(toStir, 1000); -executionThreeSeconrs(); +runsThreeSeconds();
    
     
    'Поставить на плиту'
    @@ -1015,7 +1015,7 @@ 

    setInterval

    console.log('Поставить на плиту'); setInterval(toStir, 1000); -executionThreeSeconrs(); +runsThreeSeconds();
    
     
    'Поставить на плиту'
    @@ -1033,9 +1033,9 @@ 

    setInterval

    console.log('Поставить на плиту'); setInterval(toStir, 1000); -executionThreeSeconrs(); +runsThreeSeconds();
    -
    fromStove
    +
    toStir
    'Поставить на плиту'
     
     
    @@ -1051,9 +1051,9 @@ 

    setInterval

    console.log('Поставить на плиту'); setInterval(toStir, 1000); -executionThreeSeconrs(); +runsThreeSeconds();
    -
    fromStove fromStove
    +
    toStir toStir
    'Поставить на плиту'
     
     
    @@ -1069,9 +1069,9 @@ 

    setInterval

    console.log('Поставить на плиту'); setInterval(toStir, 1000); -executionThreeSeconrs(); +runsThreeSeconds();
    -
    fromStove fromStove fromStove
    +
    toStir toStir toStir
    'Поставить на плиту'
     
     
    @@ -1087,7 +1087,7 @@ 

    setInterval

    console.log('Поставить на плиту'); setInterval(toStir, 1000); -executionThreeSeconrs(); +runsThreeSeconds();
    
     
    'Поставить на плиту'
    @@ -1299,7 +1299,7 @@ 

    Пример

    -
    
    + 
    
     var fs = require('fs');
     var fileName = __dirname + '/data.json';
     
    @@ -1315,6 +1315,10 @@ 

    Пример

    +
    +

    callback

    +
    +

    callback

    @@ -1402,8 +1406,8 @@

    callback. Недостатки

    -
    -
    +

    callback. Недостатки

    @@ -1475,7 +1479,7 @@

    callback. Когда испо

    -
    +
    @@ -1499,7 +1503,7 @@

    callback. Когда испо

    Promises

    -
    +

    Promises. Асинхронный код

    -
    
    + 
    
     var promise = new Promise(function (resolve, reject) {
     
     
    @@ -1558,7 +1562,7 @@ 

    Promises. Асинхронный код

    Promises. Асинхронный код

    -
    
    + 
    
     var promise = new Promise(function (resolve, reject) {
     fs.readFile('data.json', function (err, data) {
     
    @@ -1574,7 +1578,7 @@ 

    Promises. Асинхронный код

    Promises. Асинхронный код

    -
    
    + 
    
     var promise = new Promise(function (resolve, reject) {
     fs.readFile('data.json', function (err, data) {
     if (err) {
    @@ -1590,7 +1594,7 @@ 

    Promises. Асинхронный код

    Promises. Асинхронный код

    -
    
    + 
    
     var promise = new Promise(function (resolve, reject) {
     fs.readFile('data.json', function (err, data) {
     if (err) {
    @@ -1669,7 +1673,7 @@ 

    Promises. Достоинств

    -
    
    + 
    
     var promise = new Promise(function (resolve, reject) {
     fs.readFile('data.json', function (err, data) {
     if (err) {
    @@ -1753,7 +1757,9 @@ 

    Чейнинг

    function getDefault() { return { name: 'Sergey' }; } +
    +
    
     function getAvatar (data) {
     var name = data.name;
     return request('https://my.avatar/' + name);
    @@ -1768,6 +1774,14 @@ 

    Чейнинг

    style="background: none;" />
    +
    +
      +
    • then вернул данные — передаём по цепочке дальше
    • +
    • then вернул промис — передаём результат работы промиса
    • +
    • произошла ошибка — реджектим промис
    • +
    +
    +
    
     promise
    @@ -1814,14 +1828,6 @@ 

    Чейнинг

    promise.then(getAvatar);
    - -
    -
      -
    • then вернул данные — передаём по цепочке дальше
    • -
    • then вернул промис — передаём результат работы промиса
    • -
    • произошла ошибка — реджектим промис
    • -
    -
    @@ -1899,8 +1905,8 @@

    Почитать

    // https://github.com/hakimel/reveal.js#configuration Reveal.initialize({ controls: false, - progress: true, - slideNumber: true, + progress: false, + slideNumber: false, history: true, center: true, hideAddressBar: true, diff --git a/08-async/text.txt b/08-async/text.txt new file mode 100644 index 0000000..f9071cb --- /dev/null +++ b/08-async/text.txt @@ -0,0 +1,119 @@ +[v] 1. Синхронный код. Стек вызовов. Очередь событий [1.1 - 4.10] (10-12 минут) +[v] 2. Системные таймеры: setTimeout, setInterval, clearInterval [5.1 - 6-13] (8-10 минут) +[v] 3. Особенности работы системных таймеров. Нулевой интервал [7.1 - 8.6] (7-9 минут) +[ ] 4. Работа с файлами: синхронное и асинхронное чтение [9.1 - 9.8] (8-10 минут) +[ ] 5. Использование колбеков для работы с асинхронностью [10.1 - 10.15] (10-12 минут) +[ ] 6. Промисы. Создание. Использование. Достоинства и недостатки [11.1 - 11.18] (8-10 минут) +[ ] 7. Цепочки промисов. Параллельность в промисах [12.1 - 13.4] (7-9 минут) + +1. Привет. На этой неделе я расскажу вам о том что такое асинхронный код и как +с ним работать в языке JavaScript. + +2. Почти весь код, который мы рассматривали до этой лекции был синхронным, +а значит мы всегда могли однозначно понять какая функция сейчас выполняется. +Например, если мы объявим несколько функций который помогут нам приготовить +кофе и станем вызывать их одну за другой, то мы получим результат в том порядке +в котором вызывали функции, шаг за шагом. + +С асинхронным кодом все немного сложнее. Для того чтобы понять как устроена +асинхронность в JavaScript'е давайте рассмотрим следующие две темы: стек вызовов +и очередь событий. + +Стек вызовов это структура данных которую использует интерпретатор. Перед тем как +начать выполнять наш код он помещает в стек анонимную функцию, +которая содержит код программы. Вызывая эту функцию интерпретатор выполняет код, +когда весь код отработает функция завершится, то анонимная функция будет +вытолкнута из стека и наша программа завершит свою работу. + +Если на выполняемом участке кода встречается вызов функции то она помещается на +вершину стека, а интерпретатор начинает работать с ней. В нашем случае при работ + +9.1 Ещё один способ записать функцию в очередь событий - это выполнить некоторую +асинхронную операцию после выполнения которой будет вызван обработчик. В качестве +таких операций могут выступать операции работы с файлами. Давайте рассмотрим их +подробнее + +Для того чтобы поработать с файловой системой мы подключим встроенный модуль fs +при помощи функции require. Для того чтобы прочитать файл, который находится в +той же директории что и файл с нашим кодом мы можем воспользоваться переменной +__dirname в которой находится абсолютный путь для директории с нашим кодом. + +Далее мя производим чтение файла при помощи метода readFileSync бибилиотеки fs +Первым аргументом функция принимет путь до нужного файла, вторым - кодировку в +которой нужно проситать файл. Если не указать кодировку то функция вернет буфер +вместо строки. По завершению чтения мы выведем содердимо файла на консоль. + +В данном случае мы воспользовались синхронным методом чтения файла, на это указывает +суффикс sync. И если мы имеем дело с небольшими файлами такой способ чтения допустим. +Чтобы определить как долго проиходит операция чтения мы воспользуемся методом time +и свойства console. Для того чтобы запустить замер времени мы вызовем метод time +со с произвольной строкой - идентификатором, например readFileSync. Для +остановки замера вызовем парную функцию timeEnd с таким же идентификатором. + +В результате мы увидим на консоли время, в течение которого наш код простаивал. +В данном слуае это три секуды, наверное это не очень много. Однако, если взять +файл по-больше то это время увеличиваетс в разы. Например для большого файла bigData.mov +это время составит аж целых три с половиной секунды. А это значит что всё это время +наш сервер простаивал, не обрабатывал запросы пользователей и не делал никакой +другой полезной работы. + +... + +В этом видео мы подробнее разберем как устроены колбеки, перечислим сильные и +слабые стороны этого способа работы с асинхронным кодом. Разберем +когда следует применять этот подход. + +Коллбек, или функция обратного вызова в nodejs имеет следующую сигнатуру: +первый аргумент коллбека это ошибка которая произошла во время выполнения асинхронной +операции. Если операция выполнилась без ошибки, то в качестве первого аргумента в функцию +принято передавать null. Вторым аргументов в коллбек передаются данные, которые были +получены во время выполнения асинхронной операции. Например, в случае чтения +файла во втором аргументе будет находиться содержимое файла. + +Используя коллбеки мы не несем никаких дополнительных накладных расходов, +это быстрый способ обработать результат асинхронной операции. Помимо этого для +использования коллбеков нам не понадобится никаких дополнительных библиотек. + +Однако, используя коллбеки мы получаем следующий набор недостатков. +Во-первых, при усложнении асинхронного кода реализованного на коллбеках +растет уровень вложенности. В данном примере обработчик данных - вывод на +консоль находится на втором уровне вложенности, однако как только мы заходим +прочитать два файла последовательно, то обработчик положительного результата +будет аж на четвертом уровне. И чем сложнее ваш код тем глубже и запутаннее +становится код. + +Во-вторых обработка ошибки и данных, разных по своей природе исходов, приходится +производить в одном месте что конечно же усложняет код + +Промисы +В этом видео мы рассмотрим с вами ещё один подход для работы с асинхронным кодом +который называется промисы. Научимся их создавать и навешивать обработчики, которые +позволят работать с результатами асинхронных операций. Рассмотрим положительные +и отрицательные стороны этого подхода. + +Для того чтобы создать промис нам необходимо вызвать его конструктор при помощи +с оператором new. Первым аргументов в конструктор промиса необходимо передать +функцию которая содержит код работы с асинхронным кодом. В случае, если + +... + +Для того чтобы получить результат работы промиса нуобходимо добавить к нему обработчики +при помощи вызова метода then. Стоит отметить, что метод then мы можем вызывать +вне зависимости от того завершился промис или нет. + +Первым аргументом в метод then передается кобек, который будет вызван если промис +завершибся успешно. Если же во время выполнения асинхронной операции произошла +ошибка, то вызывается колбек который передается в then вторым аргументом. +В нашем мы можем записать обработчики более компактно, вот так, потому что console.log +и console.error уже являются функциями. + +... + +Чейнинг, или объединение промисов в цепочку позволяет описывать сложную +логику проще. + +В прошлом видео мы создали промис и добавили обработчики на результат чтения +файла при помощи вызова метода then. Давайте разберемся как можно создать простую +цепочку промисов с той же функциональностью + +Рассмотрим следующие функции хелперы которые делают следующее: diff --git a/css/theme/yandex.css b/css/theme/yandex.css index 328fda0..d52b6c5 100755 --- a/css/theme/yandex.css +++ b/css/theme/yandex.css @@ -60,6 +60,11 @@ body { .reveal h2 { font-size: 2.11em; } +.slide-number { + color: white; + font-size: 16px !important; +} + .reveal h3 { font-size: 1.55em; }

    AltStyle によって変換されたページ (->オリジナル) /