Стрелочные функции. Фундаментальный JavaScript

Поделиться
HTML-код
  • Опубликовано: 20 сен 2024
  • В современном JavaScript есть возможность выбирать синтаксис по написанию функцию. Старые подходы остаются актуальными, но появившиеся в 2015-м стрелочные функции стали лаконичным решением, вместе с тем решившим набившую оскомину проблему потери контекста.
    00:57 Базовый пример, es5 синтаксис
    02:11 Базовый пример, стрелочная функция
    03:06 Сокращенная запись
    04:40 Параметры по умолчанию es6
    06:04 Пример с одним параметром
    07:45 Пример без параметров
    08:40 Передача функции как параметра
    11:25 Нюанс использования контекста
    #стрелочныеФункции #js #es6
    __
    Мои курсы по вебу с купонами:
    ✅ mishanep.com/
    📢 Заказать консультацию можно здесь pcgramota.com/...

Комментарии • 52

  • @sergeidubrovin3643
    @sergeidubrovin3643 Год назад +15

    Это редкое везенье встретить на просторах инета такого грамотного специалиста, который так чётко всё объясняет. Прекрасная речь, глубочайшее знание материала, правильный английский. Не зазнавайтесь только:)
    От чистого сердца, спасибо вам большое, если бы не ваши уроки по React, не сдать бы вовремя проект:) Спасибо и удачи

  • @DmitriyDev
    @DmitriyDev 3 года назад +29

    Очень хорошо разговариваете без мычания и затупов. Посмотрю весь плейлист

  • @tanay6489
    @tanay6489 3 года назад +11

    Олчитно объясняете. Ясно, чётко, коротко, понятно, без лишнего, но детально.

  • @MarshallBanananana
    @MarshallBanananana Год назад +3

    Последние три минуты видео особенно познавательны - спасибо!

  • @aph1le
    @aph1le Год назад +1

    Михаил, огромное спасибо за труд. Очень доступно продаёте информацию. Люблю вас!

  • @V4VFAloj7juAyQW
    @V4VFAloj7juAyQW 3 года назад +4

    Михаил, привет. Спасибо за курс по Реакту на Юдеми и все видео на Ютубе. Очень полезно

  • @BekzatKorganbek-e5q
    @BekzatKorganbek-e5q 2 года назад +5

    Спасибо за уроки, Михаил! Желаю успехов и процветания каналу.👍

  • @vladimir5434
    @vladimir5434 2 года назад +2

    Отличный курс! Спасибо Вам за старания!

  • @RewCSharp
    @RewCSharp 8 месяцев назад +1

    Спасибо за урок!

  • @bugaga8144
    @bugaga8144 2 года назад +1

    Очень приятное видео, большое спасибо за работу. Мне нравиться ваш формат, очень удобный, посмотрел, повторил материал, что то забытое вспомнил

  • @DrFortran
    @DrFortran 2 года назад +1

    Спасибо, что создаешь контент такого рода)) респект и вечная слава тебе!))

  • @____Olga__
    @____Olga__ 3 года назад +3

    спасибо, очень полезный , доступный контент

  • @skobanev
    @skobanev Год назад +1

    Спасибо большое.

  • @АнатолийГорбов-о1ь

    Согласен! Очень понятно и доступно объясняет информацию, спасибо за контент на канале)

  • @topgames6459
    @topgames6459 3 года назад +1

    Спасибо за уроки.
    Вроде основы но новое узнал)

  • @zagorsky1769
    @zagorsky1769 Год назад +1

    Уроки очень классные, спасибо!

  • @artursveshnikov7668
    @artursveshnikov7668 Год назад +1

    А на 1.25 вообще красота

  • @maxfox4615
    @maxfox4615 2 года назад +1

    супер ! Все четко и ясно !

  • @alexandraegorova923
    @alexandraegorova923 10 месяцев назад

    огонь! Спасибо!

  • @DmitryDolganov
    @DmitryDolganov 3 года назад +1

    Благодарю!

  • @eurorock5912
    @eurorock5912 3 года назад

    Михаил - спасибо за ролики! Подписался!) Профита и счастья)

  • @AGM140580
    @AGM140580 2 года назад

    Спасибо за качественный контент!

  • @demimurych1
    @demimurych1 2 года назад +3

    00:13:06 *Если я по старому синтаксису пойду function [...] то this потеряется*
    this никуда не теряется.
    this это идентификатор, значение которого устанавливается при _вызове функции_
    Если программист не переопределил правила bind this то -
    устанавливается this в зависимости от того каким образом функция была вызвана.
    *Если функция вызывалась в dot нотации*
    то есть как member expression, то this будет установлен в base идентификатора.
    Говоря не академическим языком при вызове:
    var obj = {
    name: 'myObj',
    method: function() {
    console.log(this);
    }
    };
    obj.method()
    то this будет установлен в значение base - то есть в нашем случае obj
    Подчеркиваю - установлено в момент вызова функции, а не в момент ее создания.
    Другой пример:
    var obj = {
    name: 'myObj',
    method: function() {
    console.log(this);
    }
    };
    var secondObj = {
    name: 'secondObj',
    methodOfSecondObj: obj.method
    };
    secondObj.methodOfSecondObj()
    this будет указывать на secondObj.
    var myFunc = obj.method;
    myFunc();
    this будет указывать на globalThis
    *Если функция вызывается как CallExpression*
    то this устанавливается:
    1) в случае Legacy Mode и with statement то в withStatement
    2) в случае strict mode на globalThis

    *В случае же ArrowExpression*
    this будет всегда в том значении, в котором он определен для Lexical Enviroment нашей ArrowExpression.
    Или для любой другой родительской Lexical Enviroment.
    Говоря не академическим языком:
    При вызове стрелочной функции, this не устанавливается.
    Доступ к this осуществляется ровно так же, как и к любому другому идентификатору -
    по цепочке областей видимости которая и является той самой цепочкой из Lexical Enviroment.
    Например:
    var obj = {
    name: 'objName',
    method: (
    function() {
    var arrow = ( () => console.log(this) );
    arrow(); // this будет тем,
    }
    )
    }
    obj.method(); // внутри arrow this будет равен obj.
    var secondObj = {
    name: 'secondObj',
    methodOfSecondObj: obj.method
    };
    secondObj.methodOfSecondObj()
    secondObj
    var arrow = ( () => console.log(this) );var obj = {
    name: 'objName',
    method: (
    function() {
    arrow();
    }
    )
    }
    secondObj.methodOfSecondObj(); // this внутри arrow бцдет уже указывать на secondObj
    а если arrow вынести из лексического окружения method то есть сделать вот так
    var arrow = ( () => console.log(this) );
    var obj = {
    name: 'objName',
    method: (
    function() {
    arrow();
    }
    )
    }
    то this всегда будет указывать на globalObj вне зависимости от того как будет вызываться method.

    • @UCnBUnAmcvCs8FePEtmn
      @UCnBUnAmcvCs8FePEtmn 2 года назад

      Для чего скобки в method: () и var arrow = () ?
      var obj = {
      name: 'objName',
      method: (
      function() {
      var arrow = ( () => console.log(this) );
      arrow(); // this будет тем,
      }
      )
      }
      obj.method();
      И еще вопрос, this в стрелочной функции берется в момент вызова или в момент определения?

    • @demimurych1
      @demimurych1 2 года назад +1

      ​@@UCnBUnAmcvCs8FePEtmn *Скобки*
      Это CodeStyle характерный для функциональной парадигмы.
      Привычка группировать код одной сущности - функционального выражения.
      Для людей привыкших к программированию в императивном стиле, значения
      большого не имеет. Кроме разве что эстетического.
      Обычно IDE при подобных группировках красиво форматирует сложный вложенный код выражения.

      *Консоль*
      Про консоль следует знать одну важную особенность - в зависимости от обстоятельств
      выполнения кода, окна к которому эта консоль привязана, назначается use strict режим.
      Соответственно, если strict режим включен, то по умолчанию, this будет undefined, в отличии
      от Legacy Mode где по умолчанию this будет Global Object.

      *Стрелочная функция*
      В стрелочной функции this определяется ровно точно так же как и для любого идентификатора.
      То есть по привычной цепочке видимости, которая, фактически задается цепочкой _Lexical Enviroment_
      То есть то, откуда берется this определяется в момент создания функции.
      Строго говоря, в JS только есть только один случай, когда this или что-либо другое, определялось
      в момент вызова - это вызов функции в дот нотации (или по заумному: _Member Expression_ ).
      Пример: _obj.myMethod()_
      Потому проще запомнить, что поведение this в случае вызова метода обьекта, который определен как функция, является исключением. И устанавливается в момент вызова. Во всех прочих случаях, везде одинаково -
      определяется правилами разрешения области видимости, то есть цепочкой лексических окружений.

      *Дополнительная информация*
      Подобное поведение характерно для реализации именно в JS. И является нормальным поведением при
      решении _нисходящей фунарг_ проблемы. В других языках можно встретить поведение где разрешение
      области видимости делается в момент вызова ( _восходящая фунарг_ проблема). Выбор одного способа или второго зависит от того, что предпочитал разработчик языка в момент формирования спецификации.

    • @UCnBUnAmcvCs8FePEtmn
      @UCnBUnAmcvCs8FePEtmn 2 года назад

      @@demimurych1 Большое спасибо за развернутый ответ

    • @demimurych1
      @demimurych1 2 года назад

      @@UCnBUnAmcvCs8FePEtmn Нема за що.

  • @DesertEagleNV
    @DesertEagleNV Месяц назад

    Качество видео - на высоте, но тема this, считаю, не раскрыта.

  • @sairexes2443
    @sairexes2443 2 года назад

    Спасибо, все четко

  • @webmaker_studio
    @webmaker_studio 2 года назад

    Клас, дякую!

  • @user-rr5xm7pj6y
    @user-rr5xm7pj6y 3 года назад +1

    Спасибо за понятное объяснение стрелочных функций. В каких случаях лучше использовать обычные, а не стрелочные функции?

    • @mishanep
      @mishanep  3 года назад +7

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

  • @u-kob
    @u-kob Год назад

    Ну вообще-то параметры по умолчанию (в ES6) и проверка с помощью условных операторов (в ранних версиях JS) немного разные вещи. Если мы будем передавать строку и она окажется пустой, то для условного оператора это будет false и он подставит то, что мы ему скажем. А вот параметр по умолчанию, если мы передаём пустую строку, уже не подставит нам значение, которое мы ему указали, и в аргументе так и останется пустая строка. Это надо учитывать.
    К тому же проверку с помощью условных операторов можно записать проще: arg = arg || "default_value"

  • @abubakrjuraev1816
    @abubakrjuraev1816 Год назад

    Привет сделай пожалуйста видос про event loop

  • @tanyamarushka7251
    @tanyamarushka7251 2 года назад

    Спасибо!

  • @erzhan225
    @erzhan225 2 года назад

    Спасибо

  • @nikonovilya
    @nikonovilya Год назад

    Михаил, подскажите, что за тему в vs code вы используете?

  • @biLLie_wiLLie
    @biLLie_wiLLie Год назад

    А почему контекст потерялся у обычной функции?

  • @dodokwak
    @dodokwak 3 года назад

    Спасибо.
    p.s.Мечтательно.... вот бы курс от автора по vue.js на Udemy.

    • @mishanep
      @mishanep  3 года назад +1

      По vue пока не планировал. Сейчас записываю большой курс по js. Потом буду думать. Хотелось по Реакту продолжение записать. Но пока в раздумьях. Теоретически можно и vue.

    • @dodokwak
      @dodokwak 3 года назад

      @@mishanep может проголосовать?
      хотя опять набегут реакто-поклонники и закидают количеством. по vue конечно тоже немало видео, но они или с огромными компонентами, куда сложены для "удобства" все кони и люди, или уж заезженные варианты
      todolist. а вот жизненного примера с обычными patterns даже типа работа с crud - пост создать и отредактировать с разбиением на макс возможное количество компонентов - нут проблемы.

    • @mishanep
      @mishanep  3 года назад

      Может. Надо вообще будет попробовать функционал голосования на ютубе. Пока не понимаю будет ли он вообще работать. Не помню чтобы я сам где то голосовал таким образом.

    • @dodokwak
      @dodokwak 3 года назад

      @@mishanep из российских вот здесь александр делал такое голосование, может он подскажет как это привинтить ruclips.net/user/PyCodingcommunity

    • @mishanep
      @mishanep  3 года назад

      Спасибо, изучу.

  • @ПетроПередерий-р1у
    @ПетроПередерий-р1у 3 года назад

    Только const в ES5 не было.

  • @sergik55
    @sergik55 2 года назад

    А есть ли курс от чтоб с 0 и сложных проектов?

    • @mishanep
      @mishanep  2 года назад

      Да, у меня есть курс Фундаментальный JS. И курс по React. И там и там есть проекты. В описании есть ссылка на мой сайт.

    • @sergik55
      @sergik55 2 года назад

      @@mishanep и я смогу изучить js c 0 или нужны базовые знания

    • @mishanep
      @mishanep  2 года назад

      @@sergik55 Там с нуля. Пререквизитом идут html и css. Если их не знаете, то у меня по ним тоже есть курс. По js предварительных знаний не требуется.

  • @andTutin
    @andTutin Год назад

    белая тема и эсклорер справа. приятного просмотра

  • @velikorossnationalist4259
    @velikorossnationalist4259 Год назад

    Добрый день! Не подскажете как затипизировать этот код с использованием хука useRef?
    function Form() {
    const ref = useRef(null)
    const focus = () => {
    ref.current.focus()
    }
    return (
    Focus
    )
    }