ЙажаСценарий / Говнокод #26280 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 codershitter, (Updated )

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

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

    Кстати, лови палочку.
    Ответить
  • Постоянно забываю, чему будет равно i после завершения цикла во всех созданных функция?
    Ответить
      • А да, точно. Это у 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

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

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

                Неужели все языки кроме этих двух -- сосут?
                Ответить
                • В некоторых языках нельзя не только выбрать вид захвата, но даже перечислить захватываемые переменные.

                  В «Питоне» есть атрибуты global и nonlocal, которые подсказывают, откуда именно можно захватить, но это всё равно не то.
                  Ответить
                  • можно случайно хватануть лишку, например (псевдокод)

                    init() {
                      val veryFuckingBigObject = getVeryFuckingBigObject()
                    
                     button.onClick  {
                       assert(veryFuckingBigObject.someSmallInt > 42);
                     }
                     mainAppForm.addItem(button)
                    }


                    видишь жопу?
                    Ответить
                    • Если передача по значению (как в правильных движках), то onClick захватит весь veryFuckingBigObject, а не только someSmallInt, поэтому если таких кнопок много, то страница сожрёт много памяти?
                      Ответить
            • UB уже есть в JavaFX WebView
              там джаваскриптом можно закрашить джаву, в кторой работает браузер

              правда это конечно касается не самого языка, а api webview
              Ответить
          • мартышки написали стандарт на 400 страниц, и все равно обосрались

            вебщики-с
            Ответить
          • О как, т.е. по спеке 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, текущее на момент вызова замыкания.

            Это у каких?
            Приведи реальный пример.
            Ответить
            • А вот, нашёл, чуть выше написано:
              http://govnokod.ru/26280#comment518162

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

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

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8