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

    −1

    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
    let windows = [];
    		for(let i=0;i<30;i++) {
    			windows.push(open('about:blank', 'w'+i, 'width=220,height=220'));
    			windows[windows.length-1].document.write('<img width="200" src="https://yandex.ru/images/_crpd/QXyR57D17/58778cEG/ztbSEyQN1MQPOKIh-mQphsVGWJdV_rEIEfYazmN1g0xPpX0igbVWfIKWpfMEAObKC6K6ZWrKj3oC51h2Nj70EtoS5kOEGYXVP10XoFpA">');
    		}
    		let x = 0;
    		for(let i=0;i<30;i++) {
    			setTimeout(function run() {
    				if(x > 10000) {
    					windows[i].close();
    					return;
    				}
    				x++;
    				windows[i].moveTo((Math.random()*screen.width).toFixed(), (Math.random()*screen.height).toFixed());
    				setTimeout(run, 100);
    			});
    		}

    Мой лучший гавнакод

    Запостил: codershitter, 27 Декабря 2019

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

    • Неактуально. Гугли "сбербанк сканит порты"

      Кстати, лови палочку.
      Ответить
    • Отхватил минус?
      Ответить
    • Постоянно забываю, чему будет равно i после завершения цикла во всех созданных функция?
      Ответить
      • Спорим, ты не реальный Rooster, а человек?
        Ответить
      • Точно не знаю, но думаю что своему значению во время захвата
        Ответить
        • А да, точно. Это у varваров будет 30. С энтим вашим жопным скриптом надо держать ухо востро.
          Ответить
          • Ещё один прикол:
            var arr = [];
            for (let x of [1,2,3])
              arr.push(() => x);
            arr.map(f => f()); // [3,3,3] on non-compliant browsers


            У некоторых браузеров замыкание захватывает значение x, текущее на момент вызова замыкания. Т. е. замыкание хранит ссылку на x. Поскольку замыкание вызывают после цикла, а после цикла значение x равно трём, то получается [3,3,3].

            У других же браузеров замыкание захватывает значение x, текущее на момент создания замыкания. Т. е. x передаётся по значению. Поэтому создаётся три разных замыкания, каждое со своим значением x, и на выходе получается [1,2,3].
            Ответить
            • Implementation defined поведение в js? Скоро и UB'ы завезут, походу...
              Ответить
              • Даже в «PHP» можно выбрать, что захватывать: ссылку или значение.
                <?php
                $arr =[];
                
                foreach([1, 2, 3] as $x) {
                  array_push($arr, function()use($x){return $x;});
                }
                
                $arr = array_map(function($f){return $f();}, $arr);
                
                echo implode(', ', $arr), PHP_EOL; // 1, 2, 3
                
                $arr2 =[];
                
                foreach([1, 2, 3] as $y) {
                  array_push($arr2, function()use(&$y){return $y;}); // обратим внимание на &
                }
                
                $arr2 = array_map(function($f){return $f();}, $arr2);
                
                echo implode(', ', $arr2), PHP_EOL; // 3, 3, 3

                & означает захват по ссылке.

                Я не говорю уже про кресты, где тоже захват явно по значению или по ссылке.
                Ответить
                • показать все, что скрытоvanished
                  Ответить
                  • В некоторых языках нельзя не только выбрать вид захвата, но даже перечислить захватываемые переменные.

                    В «Питоне» есть атрибуты global и nonlocal, которые подсказывают, откуда именно можно захватить, но это всё равно не то.
                    Ответить
                    • показать все, что скрытоvanished
                      Ответить
                      • Если передача по значению (как в правильных движках), то onClick захватит весь veryFuckingBigObject, а не только someSmallInt, поэтому если таких кнопок много, то страница сожрёт много памяти?
                        Ответить
              • показать все, что скрытоvanished
                Ответить
            • показать все, что скрытоvanished
              Ответить
            • О как, т.е. по спеке var должен захватываться по ссылке, а let - по значению?

              > non-compliant browsers
              Как всегда IE?
              Ответить
              • В IE даже стрелочных функций нет. О чём ты?

                Non-compliant browsers — это как минимум старые «Фуррифоксы», которые были ещё не на «Растишке», и «Сафари» (там не «V8», а свой движок).
                Ответить
                • P.S. Я как-то рассказывал про движок «Goanna» — форк «Gecko».

                  Так вот «Goanna 3.x» — non-compliant, а «Goanna 4.x» — compliant.

                  Страшно, когда в разных версиях одного браузера код работает по-разному?
                  Ответить
              • >> О как, т.е. по спеке var должен захватываться по ссылке, а let - по значению?

                Надо посмотреть.

                arr мы не захватывали, он же просто попадает в тело цикла из обрамляющего блока.
                Ответить
              • Проверил навскидку в паре compliant browsers. Действительно, var по ссылке, а let — по значению.
                Ответить
              • Мне кажется, всё это питушня, и нет в JS и не было никакой передачи по значению.

                У меня в хроме пример хурозвоза выдал выдал 1,2,3.
                Запустим вот такой код (в комментариях - то, что получил я):
                let x = 1;
                let f = () => x;
                f(); // 1
                x = 2;
                f(); // 2


                И 1, 2, 3 vs 3, 3, 3 - вышедший наружу обсуждавшийся выше философский вопрос о том, создаётся ли новая переменная с тем же именем внутри цикла, или же там она каждый раз новая.
                Ответить
                • Такой код везде работает одинаково. А пример с циклом в разных движках работает по-разному.

                  Похоже, что и вправду дело не в передаче по значению, а в реализации цикла (создание нового объекта на каждой итерации или изменение значения существующего объекта).
                  Ответить
            • > for (let x of [1,2,3]) arr.push(() => x);
              > У некоторых браузеров замыкание захватывает значение x, текущее на момент вызова замыкания.

              Это у каких?
              Приведи реальный пример.
              Ответить
              • Надо найти, откуда я это накопипастил... А вот отсюда:
                https://stackoverflow.com/questions/36684191/using-const-in-es6-for-of-loop

                Там только написано «Some non-compliant browsers», а реальных примеров автор так и не привёл.
                Ответить
              • А вот, нашёл, чуть выше написано:
                http://govnokod.ru/26280#comment518162

                В «Goanna» (форк «Gecko») в версии 3.x было «non-compliant», а в 4.x сделали «compliant».

                Надо ещё посмотреть, как было сделано в самых первых версиях браузерных движков, когда слово «let» только-только появилось («Хром 41...48», «Safari 10», «IE 11»).
                Ответить
                • Ну всё-таки раз в спецификации чётко указано как надо, то это просто был баг в реализации.
                  Ответить
      • 30? Они её вроде по ссылке хватают.
        Ответить
    • показать все, что скрытоvanished
      Ответить

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