1. JavaScript / Говнокод #27555

    +5

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    function call_func_1(
        f: () => void
    ) {
        f();
    }
    
    function call_func(
        f: (o: object) => void,
        user: { firstName: string }
    ) {
        f(user);
    }
    
    function main() {
        const user = {
            firstName: "World",
            sayHi() {
                print(`Hello ${this.firstName}`);
            },
        };
    
        user.sayHi();
    
        const hi = user.sayHi;
        hi();
    
        let hi2 = user.sayHi;
        hi2();
    
        call_func_1(() => {
            hi2();
        });
    
        call_func(user.sayHi, user);
    
        print("done.");
    }

    как тебе такой говно-пиздец Илон Маск?

    Запостил: ASD_77, 10 Августа 2021

    Комментарии (98) RSS

    • работал над этим пиздецом... но что-то накрутил.. а что никто не знает :)
      Ответить
    • по традиции никому не нужный дамп https://pastebin.com/RH9z6eUb
      Ответить
    • и результат работы

      C:\temp>C:\dev\TypeScriptCompiler\__build\tsc\bin\tsc.exe --emit=jit C:\temp\1.ts 
      Hello World
      Hello World
      Hello World
      Hello World
      Hello World
      done.
      Ответить
    • *комментарий для продвижения поста*
      лайкнул, подписался, нажал на колокольчик и включил все уведомления
      Ответить
      • а ну да... SEO пост - https://github.com/ASDAlexander77/TypeScriptCompiler
        Ответить
      • Кокая мерзость этот новый типаскрипт.

        А кстати в js не завозили такой штуки, чтобы указать чтоб функция не видела, и не хватала внешние пельменные.
        А коли встретит такую пельменную вываливась в райнтайме?

        Про static я знаю, но ему нужны классы и это какая-то Йажа.
        Ответить
        • Чойто мерзость?

          Пункция самозахватывает кложай любое переменную, которую ты потрогал.
          Отказаться от такого сервиса можно в С++ и PHP, вроде больше нигде нельзя
          Ответить
          • а кто мешает не захватывать переменную? никто.. это все опционально
            Ответить
            • Вопрос в том, что её можно случайно захватить, и потом GC будет блуждать в трех соснах.

              Но это нормально: GCшники должны страдать
              Ответить
            • Интересно как в кишках это оптимизировать?

              Оно же всё-равно лолжно тянуть и хранить внешний конь-текст.

              Функция захватила пельменные и пока мы держим ссылку на функцию gc не может собрать захваченную питушню. Или нет?
              Ответить
          • > Отказаться от такого сервиса можно в С++ и PHP, вроде больше нигде нельзя
            Вот именно поэтому я за С++.

            А в PHP как делать?
            Ответить
            • ты можешь перейти на писание на ассемблере и вынести себе моск. Мы же более развитые цивилизации будет использовать тот инструмент, который за тот же промежуток времени дает больший результат
              Ответить
              • Результат с большим количеством ошибок всмысле?
                Ответить
            • В «PHP» нужно захватываемые пельменные перечислять в операторе use. Всегда, иначе вообще ничего не захватит.

              Реальный пример:
              <?php
              
              $pituh1 = 'Петя';
              $pituh2 = 'Вася';
              $pituh3 = 'Коля';
              
              
              $closure = function() use($pituh1, &$pituh2) {
                  echo 'Внутри замыкания:', PHP_EOL;
                  echo $pituh1, PHP_EOL;    // Выведет 'Петя', его захватили
                  echo $pituh2, PHP_EOL;    // Выведет 'Вася', его захватили
                  echo $pituh3, PHP_EOL;    // Notice: Undefined variable — его не захватывали
              
                  $pituh1 = 'Ко-ко';        // Не изменит глобальную пельменную, её захватили по значению
                                            // Изменится только локальная копия
                  $pituh2 = 'Куд-кудах';    // Изменит глобальную пельменную, её захватили по ссылке
              };
              
              $closure();
              
              echo 'После выхода:', PHP_EOL;
              echo $pituh1, PHP_EOL;        // Выведет 'Петя', его не смогли изменить
              echo $pituh2, PHP_EOL;        // Выведет 'Куд-кудах', его захватили по ссылке и изменили
              echo $pituh3, PHP_EOL;        // Выведет 'Коля'


              https://ideone.com/qiJZcV
              Ответить
              • Ты сорокоман?
                Ответить
                • Чик-чирик!
                  Ответить
                  • Сороки не совсем чирикают:
                    https://youtu.be/dJ9hJ55hHzs?t=122

                    Кстати, "сорокоманы" это питерское. Была такая газета "Сорока", у неё было приложение "клуб 801".. Или я рассказывал уже?
                    Ответить
                    • Не помню про газету...

                      Некоторые сороки ещё, как и другие врановые, умеют пародировать других птиц и людей.
                      Ответить
                      • Ну погугли "клуб 801", он форкнулся от газеты "сорока": там питухи в виде газеты форум выпускали)

                        Врановые много чего могут, он вообще очень умные
                        Сорока проходит "зеркальный тест"
                        Ответить
              • Стильно. И лоу-левельно для оптимизации. Удивлён что только пыхеры до такого дошли.

                Явное лучше неявного, особенно когда из огромного контекста нужно захватить 1 пельменную.

                А есть use(*), ну вроде крестового [=]?
                Ответить
                • Вроде нет:
                  https://www.php.net/manual/ru/functions.anonymous.php

                  А нет, в «PHP 7.4» добавили стрелочные функции, как в новом «JS», они затягивают весь контекст:
                  https://www.php.net/manual/ru/functions.arrow.php

                  Вот взяли и всё испортили.
                  Ответить
                  • > Вот взяли и всё испортили
                    А мне нравится.

                    Для быстрого и бездумного скриптушения зделали стрелки.

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

                    Немного неконсистентно, но это же рнр…

                    При этом функции по умолчанию чистенькие и не хватаются за внешние контексты.
                    Ответить
                • Я тоже удивлён. Даже «Паскаль» захватывает весь родительский контекст.

                  В «Питоне» есть слова «global» и «nonlocal», но я не помню, в каких ситуациях они могут помочь.
                  Ответить
                  • Обколются своими захватами, а потом пердолятся с утечками:

                    https://blog.meteor.com/an-interesting-kind-of-javascript-memory-leak-8b47d2e7f156
                    Ответить
                    • Error 1020.

                      Меня в «Medium» уже больше года «Cloudflare» не пускает.
                      Ответить
                      • https://news.ycombinator.com/item?id=5959227
                        TL;DR -- all closures created within a function are retained even if only one closure is ever referenced.
                        This is really interesting, and potentially devastating for certain coding styles.
                        
                        I ran the code on node and the RSS does appear to be increasing without bound.
                        Even running node with --expose-gc and forcing a global.gc() inside logIt() causes the same unbounded memory growth.
                        
                        Increasing the size of the array by a factor of 10 causes RSS usage to jump up by a factor of 10 every second, so we know that the memory usage isn't caused by creating a new long-lived closure (i.e., the logIt() function) every second.
                        
                        In fact, removing the call to doSomethingWithStr() doesn't change the unbounded memory growth.
                        
                        Here's a shorter snippet that demonstrates the leak more dramatically (about 10 MB/sec RSS growth):
                        
                          var run = function () {
                            var str = new Array(10000000).join('*');
                            var fn  = function() {
                              str;
                            }
                            var fn = function() { }
                            setInterval(fn, 100);
                          };
                          setInterval(run, 1000);
                        
                        Tried it out on node v0.8.18
                        Ответить
                        • Не из-за этого ли сейчас браузерам двух гигов оперативки перестало хватать?
                          Ответить
                          • > двух гигов оперативки перестало хватать
                            Как там в 2010?
                            Ответить
                            • Ну то есть, что браузеры заполняют собой N гигов, а на мобилке и вовсе некоторые сайты не посмотреть, это нормально?
                              Ответить
                              • Просто не надо использовать NodeJS, WebPack и прочую поебень. Да, это говно в разы ускоряет разработку frontend-а, но в результате из десятков мегабайт обфусцированного клиентского кода действительно полезными являются 5%. Пора возвращаться к нормальной разработке на чистом JS и CSS, без React, Vue, Angular, WebPack, NodeJS, Bower, SASS и прочего говна. Помните эти файлики с красивыми переносами строк, отступами, смешными комментариями и читаемыми названиями переменных и функций? И я помню. А их нет.
                                Ответить
                                • А самое главное: в PHP, если приглядеться, ничего из этого в принципе и нят.
                                  Ответить
                                  • Именно поэтому я за «PHP».
                                    Ответить
                                  • Резонно. Тоже повод задуматься для frontend-разработчиков, вставших на распутье...
                                    Кстати, ещё один интересный момент: помнится, год-полтора назад Павлик Дуров объявлял конкурс на разработку нового веб-клиента Telegram, и объявлял не как-нибудь, а с понтом - особо подчеркнул, что новый клиент не должен использовать какие-либо сторонние библиотеки и должен использовать исключительно мощь чистого JS и CSS.
                                    И что? Сейчас открываю новый веб-клиент - а там WebPack... А вместе с ним - и тонны ненужного мусора. И в чём был смысл такого требования?
                                    Ответить
                                    • Пашка уверовал в http2 и что все 1234 жс файла можно будет скачать отдельно и забандлить нативно

                                      Пока эти светлые времена не настали, приходится ебаться с вебпаком
                                      Ответить
                                      • Ты не сможешь скачать говно быстрее, чем ширина канала. Какая разница через http или http2?
                                        Ответить
                                        • Через http скачать дохуя файлов одновременно невозможно в принципе
                                          Ответить
                                          • Сделать 20 коннекшенов и качать 20 файлов одновременно не подходит?
                                            Ответить
                                            • У меня в проекте 2000 файлов жсговна

                                              Даже 200 из них качать заебешься
                                              Ответить
                                              • Так это проблема анскильного веб говна? Казалось бы, какая разница, качнуть 2000 файлов по 1Кб, или 20 файлов по 100Кб? Оверхед на заголовки, или в чем проблема?
                                                Ответить
                                                • Браузеры не могут открыть больше 10 соединений на http1
                                                  Ответить
                                                  • Допустим нужно скачать 2000 файлов. Делаем 10 соединений, в каждом из которых качаем 200 файлов последовательно. В чём проблема так сделать?
                                                    Ответить
                                                    • Если мне надо с этим ебаться то я уже вебпак поставлю

                                                      В http2 ебаться не надо и я бы не ставил вебпак
                                                      Ответить
                                                      • Так ебаться не ты должен, а браузеры. В общем то уже поздно, пока все до единого это не поддержат, придётся ебаться с вебпаком.
                                                        Ответить
                                                        • HTTP2 в любом случае лучше, он сжимает заголовки.

                                                          Вообще нет причины НЕ использовать HTTP2, кроме пизданутых фронтов в облаках
                                                          Ответить
                                                          • > HTTP2 в любом случае лучше, он сжимает заголовки

                                                            HPACK Bomb (CVE-2016-1544, CVE-2016-2525)
                                                            HPACK Bomb is a compression layer attack that resembles a zip bomb attack or a 'decompression bomb'.
                                                            
                                                            HPACK is used to reduce the size of packet headers. Basically, the sender can tell the receiver the maximum size of the header compression table used to decode the headers.
                                                            
                                                            In this attack, a potential hacker creates small and innocent-looking messages that actually unpack into gigabytes of data on the server,
                                                             thereby consuming all the server memory resources and effectively slowing down or crashing targeted systems.
                                                            
                                                            Imperva created a header that was 4KB size -- the same size as the entire compression table.
                                                            Then on the same connection, it opened up new streams with each stream that referred to the initial header as many times as possible (up to 16K of header references).
                                                            
                                                            After sending 14 such streams, the connection consumed 896MB of server memory after decompression, which crashed the server, Imperva researchers explain.

                                                            Какое зожатие )))
                                                            Ответить
                                                            • > 2016
                                                              может, уже исправили?
                                                              Ответить
                                                              • Так в ихнем зожатии постоянно какие-то дырки.
                                                                Может уже нашли новые, но ещё не сообщили о них лалкам?

                                                                Опять мы приходим к тому о чём я уже говорил:
                                                                https://govnokod.ru/26767#comment555379
                                                                Ответить
                                                                • Я не спорю что пиздаче было бы запилить свой прот, вроде бы гугол так и сделал, не?

                                                                  Но если выбирать между 1.1. и 2, то я за 2, особенно когда надо скачать 200 файлов
                                                                  Ответить
                                                              • https://www.cvedetails.com/cve/CVE-2020-11100

                                                                In hpack_dht_insert in hpack-tbl.c in the HPACK decoder in HAProxy 1.8 through 2.x before 2.1.4, a remote attacker can write arbitrary bytes around a certain location on the heap via a crafted HTTP/2 request, possibly causing remote code execution.

                                                                Блять, ну вот как так, а?
                                                                Ответить
                                                                • Хапрокси соснул

                                                                  А что вообще случилось? Код для работы с HTTP стали писать вчерашние школьники, изучившие малёха веб-программирование?
                                                                  Ответить
                                                                  • Скорее опять соснуло зожатие зоголовков HTTP/2.

                                                                    > In hpack_dht_insert in hpack-tbl.c in the HPACK decoder
                                                                    > via a crafted HTTP/2 request, possibly causing remote code execution.

                                                                    А главное, я же сразу писал, ну сделайте бинарный прот.
                                                                    Перенумеруйте все частоиспользуемые заголовки и реализация этого говна упростится в сотни раз. Нет, нужно выдумать сложную питушню и десяток раз в ней обосраться.
                                                                    Ответить
                                                                    • > ну сделайте бинарный
                                                                      Как будто это поможет. Набежавшие обезьяны всё равно будут парсить.
                                                                      Именно в них причина, а не в оверинжирном проктоколе.
                                                                      Ответить
                                                                    • пусть тупо BSON юзают
                                                                      Ответить
                                                                    • Вообще современный айти это нагромождение говна и палочек.

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

                                                                      А ты предлагаешь сразу бункер строить
                                                                      Ответить
                                                                  • $ curl -v -o /dev/null -D - https://datatracker.ietf.org/doc/html/rfc7541#appendix-B |& grep HTTP
                                                                    > GET /doc/html/rfc7541 HTTP/1.1
                                                                    < HTTP/1.1 200 OK

                                                                    Ня! ietf.org по-прежнему отдаёт всем 1.1
                                                                    Ответить
                                                                    • текст да\
                                                                      статику нет

                                                                      да и ты сам попросил))

                                                                      проверь в хоме в дев туулс в нетворк
                                                                      Ответить
                                                                      • > проверь в хоме в дев туулс в нетворк

                                                                        GET	https://datatracker.ietf.org/doc/html/rfc7541
                                                                        Status 200 OK
                                                                        Version HTTP/1.1
                                                                        Transferred 27.54 KB (149.49 KB size)


                                                                        Ответить
                                                                        • на статику посмотри, ну
                                                                          https://postimg.cc/wtny4m7W
                                                                          Ответить
                                                                          • Ну логично, если я зайду curlом или telnetом мне отдадут человекочитаемый html, вместо полузожатого недобинаря c минифицированной уёбпаками ссаниной.

                                                                            Там вся полезная инфа выведена не картинками, а псевдографикой.

                                                                            Потому картиночки и минифицированные жсы они на работоспособность этого сайта не влияют вообще никак (зашёл с noscript).
                                                                            Ответить
                                                                      • А зачем я туда полез? Помню раньше изучал HPACK и там была какая-то говняшка, сильно резанувшая глаз.

                                                                        Оказывается анскилябры сделали вот что.

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

                                                                        Логично что при запросе нам бесполезны записи в словаре :status 200 или хедеры вроде content-type.

                                                                        А при парсинге ответа зачем хранить :path /index.html, :method GET, :method POST и accept хедеры.
                                                                        Они практически НИКОГДА не встретятся.
                                                                        RFC 7541                          HPACK                         May 2015
                                                                        +-------+-----------------------------+---------------+
                                                                        | Index | Header Name                 | Header Value  |
                                                                        +-------+-----------------------------+---------------+
                                                                        | 2     | :method                     | GET           |
                                                                        | 3     | :method                     | POST          |
                                                                        | 4     | :path                       | /             |
                                                                        | 5     | :path                       | /index.html   |
                                                                        | 6     | :scheme                     | http          |
                                                                        | 7     | :scheme                     | https         |
                                                                        | 8     | :status                     | 200           |
                                                                        | 9     | :status                     | 204           |
                                                                        | 10    | :status                     | 206           |
                                                                        | 11    | :status                     | 304           |
                                                                        
                                                                        | 15    | accept-charset              |               |
                                                                        | 16    | accept-encoding             | gzip, deflate |
                                                                        | 17    | accept-language             |               |
                                                                        | 18    | accept-ranges               |               |
                                                                        
                                                                        | 29    | content-location            |               |
                                                                        | 30    | content-range               |               |
                                                                        | 31    | content-type                |               |

                                                                        Во всех стандартах вроде видео-кодеков используется контекстное зожатие, когда есть несколько моделей/контекстов и выбирается самая подходящая (CABAC).

                                                                        А тут запрос/ответ, форматы разные. Оно само собой напрашивается.
                                                                        Ответить
                                                                        • Какой анскилл )))
                                                                          Ответить
                                                                        • Какое зожатие )))

                                                                          Они хоть веса этим хедерам присвоили? Или все равновероятны?
                                                                          Ответить
                                                                          • > Или все равновероятны?

                                                                            По-моему равновореанты. В таблице 61 элемент, почему именно 61 я не помню, вроде им кодового пространства не хватало.

                                                                            Но потом каждая запись из таблицы проходит статического хаффмана.
                                                                            Это чтобы протокол был человекочитабельнее )))

                                                                            И превращается в 1 бат зожатия информации.
                                                                            Ответить
                                                                            • > хаффмана

                                                                              А, ну может на этом уровне вносится разница между запросом и ответом и некоторые значения остаются без кодов?

                                                                              Или хаффман там одинаковый и туды и сюды?
                                                                              Ответить
                                                                              • > Или хаффман там одинаковый и туды и сюды?

                                                                                Да. И выровненный по батам.
                                                                                0x82 — это всегда method GET
                                                                                0x88 — status 200

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

                                                                                Хаффман там больше для того чтобы зожимать цифробуквы, которых нету в словаре.
                                                                                Ответить
                                                                                • > выровненный

                                                                                  Какой анскилл )))

                                                                                  Карго-культ 99лвл. Интересно, чуваки вообще задумывались, зачем им хаффман?
                                                                                  Ответить
                                                                                  • В смысле одно поле (хедер или его значение) ­— выравнивается по батам.

                                                                                    Пушо оно может работать и без хаффмана, только со словарём.

                                                                                    Тогда получается бинарная питушня с вкрапленями текста. Ну как орешки в говнеце.
                                                                                    Ответить
                                                                                • > цифробуквы

                                                                                  Так всё-таки на 1 бат равняется каждый код или весь заголовок в конце?
                                                                                  Ответить
                                                                                  • Каждый код из словаря — 1 бат.

                                                                                    Всё что мимо словаря может идти плейнтекстом или опционально зожато фофманом.
                                                                                    Ответить
                                                                                    • Поняла, что нихуя не понимаю. Почитаю вечером rfc'шку на это говно.
                                                                                      Ответить
                                                                                  • https://datatracker.ietf.org/doc/html/rfc7541#section-5.2
                                                                                    As the Huffman-encoded data doesn't always end at an octet boundary,
                                                                                       some padding is inserted after it, up to the next octet boundary.  To
                                                                                       prevent this padding from being misinterpreted as part of the string
                                                                                       literal, the most significant bits of the code corresponding to the
                                                                                       EOS (end-of-string) symbol are used.

                                                                                    Принцимп мухи )))

                                                                                    Тут и паддинг по октетам и EOS.

                                                                                    > rfc'шку на это говно.
                                                                                    Кстати я наконец-то понял Юрца, почему именно «мухи».
                                                                                    Ответить
                                                                                    • Так подожди, если у меня код из словаря встретится посреди строки, то этот код сам по себе не будет выровнян на бат? Будет выровнена только вся строка в целом?
                                                                                      Ответить
                                                                                      • Строка берётся или целиком из словаря или целиком набирается текстом.

                                                                                        Там нет lz.
                                                                                        Ответить
                                                                                        • А, вон как.

                                                                                          Даже в сраном DNS есть зайчатки lz с отсылками к предыдущим полям. А тут нету. А ведь можно было на старые запросы ссылаться, в них половина хедера повторяется, такой простор для зожатия...
                                                                                          Ответить
                                                                                          • > А ведь можно было на старые запросы ссылаться, в них половина хедера повторяется, такой простор для зожатия...

                                                                                            Уже обосрались в SPDY c CRIME.

                                                                                            https://govnokod.ru/26767#comment555379

                                                                                            http://netifera.com/research/crime/CRIME_ekoparty2012.pdf
                                                                                            Ответить
                                                                              • А смысл хафмана в том, чтобы более частым дать более короткие префиксы?
                                                                                Ответить
                                                                      • Там из статики два минифицированных скрипта, которые сайту в принципе не нужны, он работает и без них. И отдаются они по HTTP/1.1.
                                                                        Ответить
                                                                        • Киллер-фича tools.ietf.orc – текстовые файлы переделаны в html
                                                                          и они статические
                                                                          Ответить
                                                                        • P.S. А нет, вру, два скрипта действительно отдаются по HTTP/2.0.

                                                                          Зачем? Зачем? Из-за длинных заголовков «content-security-policy» и «X-Frame-Options»?
                                                                          Ответить
                                                  • Ещё в 10-й «Опере» можно было открыть 128 соединений всего и даже 128 соединений с одним сервером (по умолчанию в настройках было 16 и 64 соответственно). Правда, некоторые сервера не позволяли одному клиенту открыть столько соединений.
                                                    Ответить
                                                    • Столько проблем из-за экономии на толщине провода.
                                                      Ответить
                                              • > 2000 файлов жсговна
                                                https://youtu.be/Vq0bKROEm-c
                                                Ответить
                                • > не надо использовать NodeJS
                                  А Node.JS тут причём? Он не ворует память на клиенте.
                                  А сколько он займёт на сервере - дело программиста. Если программист не смузихлёб, то целый сервер будет жрать памяти меньше, чем одна вкладка типичного сайта в браузере.
                                  Ответить
                                • > Помните эти файлики с красивыми переносами строк, отступами, смешными комментариями и читаемыми названиями переменных и функций? И я помню. А их нет.
                                  Как это нят?
                                  https://gcode.space/ngk.js
                                  (@^◡^)
                                  Ответить
                            • Это «Бром» показал всем дурной пример, начав плодить процессы-воркеры с целью отожрать побольше памяти и CREATE_BREAKAWAY_FROM_JOB
                              Ответить
                          • Не. Эту питушню лет 5 как починили. Хотя может если как-то совсем хитро извернуться, то оно и потечёт.

                            Но сам факт что каждому кто реализует язык нужно пердолиться. Потому мне интересно как эта питушня реализована в компиляторе у ОПа?

                            I'm a very lazy (oops) language implementer. Every time but one when I've implemented closures, I took the quick approach of just copying the entire frame to the heap.

                            The other time, I was able to do more data flow analysis, but it also resulted in a bunch of annoying fiddly bugs and took more maintenance.

                            I'm not suggesting the v8 team took the 'easy way' out, but doing the deep introspection is hard, and in an environment such as a browser, I can see trading a pathological case such as this for what must be 1,000,000,000 inappropriate aggressive gc bugs.
                            Ответить
                    • Да вот как-бы да.

                      Крестоблядь хотя-бы понимает что у нее где лежит.
                      А GC-блядь да еще и с неявным захватом кложей может запутаться и узнать о лике через пол года, когда случится ООМ
                      Ответить
                  • "global" и "nonlocal" — это про присваивание. По-умолчанию Питон присваивает локальному имени, а глобальные и нелокальные (которые выше по неймспейсу, но ещё ня в глобальном) затеняются.
                    Ответить
                  • Кстати, "Питон" тут всех переиграл: у няго замыкания полностью явные, и можня прямо в терминале посмотреть, что замыкание захватило.
                    def f():
                        a = 16
                        b = {'x': 42}
                        def g():
                            print(f'{g.__qualname__}(); b = {b}')
                        return g
                    
                    
                    g = f()
                    print(g.__closure__)  # (<cell at 0x...2F40: dict object at 0x...D4C0>,
                                          #  <cell at 0x...0520: function object at 0x...6160>)
                    print(g.__closure__[0].cell_contents)  # {'x': 42}

                    Как видня, замыкание захватывает только те локальные переменные, которые в нём упомянуты.
                    Ответить
                    • А это потому что захват по значению, а не по ссылке.

                      При зохавывании по значению достаточно просто скопировать нужные переменные в контекст лямбды.
                      Ответить
              • Именно поэтому я за «PHP».
                Ответить

    Добавить комментарий